Проектирование структуры базы данных важнейшая задача при создании любой CMS.
Вышла 1.0.1-BETA-3
В 1.0.1-BETA-3
проработаны 24 основные ресурса (таблицы). Минимальный набор для легкого интернет-магазина.
Главное это: максимальная скорость доступа к данным и минимальное количество колонок в самых запрашиваемых ресурсах.
- Пример: одна числовая колонка в ресурсе с 1 млн. записей может занимать более 50 Мб.
Му уверены в том, если возможно обойтись колонкой в одном ресурсе и не дублировать эту колонку на двух ресурсах, нужно поступать именно так. Мы считаем что такой подход дает более широкие возможности (хранить несколько описаний товара или несколько цен), а также не сильно уступает по скорости доступа, чем запрос конкретного id
. Учитывая что файл table_name.json
открывается для чтения полностью, то по скорости при наличии достаточного количества оперативной памяти нет особой разницы искать один id
или несколько price_id
.
- Пример: В таблице
product
мы убрали прямую связь с ресурсами: description, seo, og, price
Необходимо максимально группировать данные с потенциально большим объемом.
- Пример: Тексты, Картинки - одн ресурс для текстов и один для картинок на всю базу данных.
- Скачайте файл db.json отредактируйте его если вы хотите внести свои дополнения.
- Скопируйте файл в папку
ваша_бд
/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" => base64_encode('{
"product": "all",
"user": ["phone","email","fname","iname","oname"],
"address": "all"
}')
price
- Товары для вывода на сайтеcategory
- Категорииproduct
- Товары (Виртуальный каталог)type
- Типы товараbrand
- Брендыserie
- Серии товараimages
- Изображенияseo
- SEO текстыdescription
- Описания и текстыparams
- Свойства товара
article
- Статьиarticle_category
- Категории статей
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
- Значения свойств
При создании отзыва автоматически создается Тикет, что дает возможность проконтролировать реакцию персонала на отзывы клиентов.
- База адресов может быть покупная или собираться автоматически в процессе работы сайта
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
- Ответы сервисов на запрос к ихним API
ticket
- Основная таблица тикет системы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
Если вам подходит наша структура базы данных, вы может использовать ее в своих проектах.
Пример скрипта на PHP для создания ресурсов (таблиц) в базе MySQL из файла db.json
$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 млн. записей) мы предлагаем разбивать хранение данных ресурса на несколько файлов.
Разбивка системы хранения ресурса на несколько файлов по указанному лимиту записей
- Ставим лимит для одного файла 100.000 записей
resource_name
- первый файл ресурса содержит в 10 раз меньше записей чем выставлено в лимите, это самые часто запрашиваемые данные, база индексирует по полю score количеству запросов. Доступ к самым популярным данным всегда будет минимум в 10 раз быстрее чем к менее популярным.resource_name_1
- содержит отid
=1 доid
=100000resource_name_2
- содержит отid
=100001 доid
=200000- Записи не смещаются вверх при удалении и
id
=100002 не может попасть в файлresource_name_1
даже если в файле останеться 1000 записей. - Мы всегда знаем в каком файле запись с конкретным id.
- Зная последний id мы всегда знаем со скольких файлов состоит ресурс.
Пишите нам на почту open.source@pllano.com
Вы можете оставлять свои предложения и пожелания в issues, или вы нашли баг в db.json загляните в issues, возможно, про него мы уже знаем и скоро исправим. Если нет, лучше всего сообщить о нём там.
За новостями вы можете следить по коммитам в этом репозитории. RSS.
The MIT License (MIT). Please see LICENSE for more information.