Проектирование структуры базы данных важнейшая задача при создании любой 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илиfalseinteger— Целое число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- Ресурсuserjhbg5r_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.