Database structure for Standard «APIS-2018»
Проектирование структуры базы данных важнейшая задача при создании любой CMS.
В 1.0.1-BETA-3
проработаны 24 основные ресурса (таблицы). Минимальный набор для легкого интернет-магазина.
Главное это: максимальная скорость доступа к данным и минимальное количество колонок в самых запрашиваемых ресурсах.
Му уверены в том, если возможно обойтись колонкой в одном ресурсе и не дублировать эту колонку на двух ресурсах, нужно поступать именно так. Мы считаем что такой подход дает более широкие возможности (хранить несколько описаний товара или несколько цен), а также не сильно уступает по скорости доступа, чем запрос конкретного id
. Учитывая что файл table_name.json
открывается для чтения полностью, то по скорости при наличии достаточного количества оперативной памяти нет особой разницы искать один id
или несколько price_id
.
product
мы убрали прямую связь с ресурсами:Необходимо максимально группировать данные с потенциально большим объемом.
ваша_бд
/core
/ и база данных api-json-db или API Shop автоматически создаст новые ресурсы.boolean
— Логический тип true
или false
integer
— Целое числоdouble
— Число с плавающей точкойstring
— СтрокаИспользуется функция gettype — Возвращает тип переменной
Например ресурс user
имеет id
и user_id
Ответ очень прост
structure-db проектируется с учетом того что данные будут приходить из API сторонних платформ и ресурсов. Таким образом при создании новых записей в ресурсе id
будет локальным и иметь свою очередность, а user_id
будет приходить извне и через него будут связаны данные в базе.
relations
relations
- Очень важный параметр запроса позволяющий получать в ответе необходимые данные из других связанных ресурсов.
Для передачи дополнительных параметров в json
формате с последующим кодированием данных в формат MIME base64 функцией base64_encode
Параметры: Название связаного ресурса равно "all"
или строка с параметрами
В нашем запросе к ресурсу мы хотим дополнительно получить:
product
- товары в заказеuser
- данные покупателяaddress
- данные адреса покупателяrelations
"relations" => base64_encode('{
"product": "all",
"user": ["phone","email","fname","iname","oname"],
"address": "all"
}')
site
- Конфигурация сайтаlanguage
- Мультиязычностьprice
- Товары для вывода на сайтеcategory
- Категорииproduct
- Товары (Виртуальный каталог)type
- Типы товараbrand
- Брендыserie
- Серии товараimages
- Изображенияseo
- SEO текстыdescription
- Описания и текстыparams
- Свойства товараrole
- Роли пользователейuser
- Пользователиcontact
- Контактные данныеaddress
- Адресаcurrency
- Валютыcart
- Корзинаorder
- Заказыpay
- Оплатыarticle
- Статьиarticle_category
- Категории статейcached
- Кешqueue
- Очередь запросовstores_list
- Список магазиновtemplates_list
- Список шаблоновmenu
- Менюaccount
- Счетаcorporation
- Юридические лицаseller
- Конфигурация продавцаprice_rule
- Ценовые правила продавцаprice_list
- Прайс-листыprice_list_rule
- Ценовые правилаsupplier
- Поставщикиsupplier_currency
- Курсы валют поставщиковsupplier_account
- Юр. лица поставщиков (связь с таблицей account)property_product
- Свойства товараproperty
- Настройки и связи набора и списка свойствproperty_set
- Наборы свойствproperty_list
- Список свойствproperty_value
- Значения свойствreview
- Отзывы и обзорыcomment
- Коментарииrating
- Рейтинги: отзывов, коментарией итд.location
- База адресовcountry
- Странаregion
- Область (регион)postal_code
- Почтовый индексcity
- Город (населенный пункт)district
- Район городаstreet
- Улицаcomplect
- Комплекты: Товар состоит из …buytogether
- Вместе дешевлеrelevance
- Релевантность, Популярность, Рейтингcustomer
- Клиентыpromo_code
- Промо кодыdiscount_card
- Дисконтные картыspecial_offer
- Специальные предложенияproposals
- Предложенияperson
- Сотрудники компании, поставщиков итд.invoice
- Счетаinvoice_product
- Товары в счетахinvoice_product_status
- Статусы товаровcontract
- Договораpayment
- Платежиpayment_type
- Типы платежейpayment_resource
- Ресурсы платежейdelivery
- Доставкаdelivery_options
- Способы доставкиreclamation
- Рекламацииbill
- Приходные накладныеbill_move
- Накладные перемещенияbill_product
- Товары в приходных накладныхinventarization
- Инвентаризацияinventarization_item
- Товары в инвентаризацииhistory_order
- История заказовhistory_invoice
- История счетовhistory_product
- История товаровhistory_payment
- История платежейerror
- Лог ошибокredirect
- Редиректыapi
- Ключи доступа к APIapi_request
- Запросы к APIapi_response
- Ответы сервисов на запрос к ихним APIticket
- Основная таблица тикет системыticket_category
- Категории тикетовticket_status
- Статусы и связи тикетовticket_message
- Сообщенияmessage
- Сообщенияquestion
- Вопросы с сайтаsubscription
- Подписки на рассылкиsending
- Рассылкиsending_set
- Настройки рассылокsending_statistic
- Статистика рассылокbot
- Типы и настройки ботовchat_bot
- Бот роутер - через него проходит общение между ботами и пользователямиsupport_bot
- Бот автоматически отвечает на популярные вопросы до покупкиservice_bot
- Бот автоматически отвечает на популярные вопросы после покупкиsearch_bot
- Бот помогающий в поиске по сайтуview_bot
- Бот на основании интересов пользователя предлагает товарыseller_bot
- Бот продавец-консультантstorage_bot
- Бот отвечающий по наличию товараorder_bot
- Бот дает информацию по заказамarchive
- Общий архив информации для всех ботовДля дополнительной безопасности в начале названия ресурсов или колонок может быть указан префикс
Установить префиксы
$db->setPrefixTable("sf"); // Установить префикс ресурса
$db->setPrefixColumn("jhbg5r"); // Установить префикс колонки
Результат:
sf_user
- Ресурс user
jhbg5r_login
- Колонка login
Если вам подходит наша структура базы данных, вы может использовать ее в своих проектах.
$uri_db = "db.json";
if (file_exists($uri_db)){
// Загрузить файл db.json
$db = json_decode(file_get_contents($uri_db), true);
if (count($db) >= 1) {
// Подключаетесь к базе
$link = mysqli_connect($host, $user, $password, $database) or die("Ошибка " . mysqli_error($link));
if (!$link) {exit;}
foreach($db as $table){
// Если существует колонка table
if (isset($table["table"])) {
if (count($table["schema"]) >= 1 && $table["action"] == "create") {
$row = "";
foreach($table["schema"] as $key => $value){
if (isset($key) && isset($value)) {
if ($key != "id" && preg_match("[a-z0-9_]", $key)) {
if ($value == "boolean" || $value == "string" ||
$value == "integer" || $value == "double") {
// Конвертируем тип
$value = str_replace("boolean", "CHAR( 5 ) NOT NULL DEFAULT ''", $value);
$value = str_replace("text", "TEXT NOT NULL DEFAULT ''", $value);
$value = str_replace("datetime", "DATETIME NOT NULL", $value);
$value = str_replace("string", "VARCHAR( 255 ) NOT NULL DEFAULT ''", $value);
$value = str_replace("integer", "INT( 11 ) NOT NULL DEFAULT '0'", $value);
$value = str_replace("double", "FLOAT( 11, 2 ) NOT NULL DEFAULT '0.00'", $value);
$row .= ", ".$key." ".$value;
} else {
echo "название поля или тип данных не определены";
}
} else {
echo $key." не прошел проверку preg_match [a-z0-9_]";
}
} else {
echo "value у ".$key." должен иметь один из типов: boolean, string, integer, double";
}
}
if (!mysql_query("SELECT * FROM `".$table["table"]."`")){
// Создаем таблицу
$query ="CREATE TABLE IF NOT EXISTS ".$table["table"]."(
id INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY".$row."
)";
} else {
// Обновляем существующую таблицу
$query ="ALTER TABLE ".$table["table"]."
CHANGE id INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY".$row;
}
// Отправляем запрос
mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link));
} else {
echo "У ".$table["table"]." отсутствует schema или action != create";
}
} else {
echo "Название одной из таблиц не определено";
}
}
// Закрываем соединение с БД
mysqli_close($link);
echo "Создание таблиц прошло успешно";
return true;
} else {
echo "Таблицы в файле db.json не найдены";
return false;
}
} else {
echo "По указанному пути ".$uri_db." файл не найден";
return false;
}
При желании можно дописать автоматическое создание индексов и связей.
При очень больших файлах ресурсов (свыше 1 млн. записей) мы предлагаем разбивать хранение данных ресурса на несколько файлов.
Разбивка системы хранения ресурса на несколько файлов по указанному лимиту записей
resource_name
- первый файл ресурса содержит в 10 раз меньше записей чем выставлено в лимите, это самые часто запрашиваемые данные, база индексирует по полю score количеству запросов. Доступ к самым популярным данным всегда будет минимум в 10 раз быстрее чем к менее популярным.resource_name_1
- содержит от id
=1 до id
=100000resource_name_2
- содержит от id
=100001 до id
=200000id
=100002 не может попасть в файл resource_name_1
даже если в файле останеться 1000 записей.Пишите нам на почту open.source@pllano.com
Вы можете оставлять свои предложения и пожелания в issues, или вы нашли баг в db.json загляните в issues, возможно, про него мы уже знаем и скоро исправим. Если нет, лучше всего сообщить о нём там.
За новостями вы можете следить по
коммитам в этом репозитории.
RSS.
The MIT License (MIT). Please see LICENSE for more information.