Мне нужно выбрать структуру базы данных, в которой будут храниться типы контента (например, статьи блога, страницы, документы, счета-фактуры, оценки и т. Д.) С динамическими полями: например, тип контента Estimate
должен иметь поля title
, date
и total price
.
Однако со временем эти поля могут быть добавлены или удалены, поэтому через 1 год тип константы Estimate
может иметь поле notes
.
Это обычная задача, предоставляемая известной CMS (например, drupal), но мне интересно, как лучше всего добиться максимальной производительности и гибкости: например, Drupal использует одну таблицу с полями basic
(например, title
), а все дополнительные поля хранятся в вложенных таблицах, создаваемых на лету и связанных с основным с помощью внешних ключей:
table node
| id | title | ...
| 1 | First example |
table fields_node_total_price
| id | node_id | value |
| 1 | 1 | 123.45 |
table fields_node_date
| id | node_id | value |
| 1 | 1 | 12345677 |
и т.д ..
Моя точка зрения заключается в том, что этот подход очень гибок, но легко поддается проблеме производительности: чтобы получить все поля для документа, необходимо много раз объединять таблицы, а сам код должен многократно повторяться для построения запрос (но это не должно быть проблемой).
Кстати, многостоловый подход - наиболее часто используемый подход, поэтому у него должно быть много минусов.
Я думаю, какие недостатки будут иметь использование одной таблицы:
| id | title | total_price | date | ec...
Я провел несколько тестов с 5 и 50 дополнительными полями; производительность между подходом с одной таблицей и подходом с несколькими таблицами огромна: одна таблица примерно в 50 раз быстрее.
Каждый раз, когда добавляется поле, в таблицу добавляется столбец. Какие проблемы возникнут при таком подходе?
EDIT
Позвольте мне предоставить несколько деталей:
- Приложение все еще находится на этапе разработки, это полная переработка старого приложения, где номера полей были статическими
- Мы провели несколько тестов, имитирующих объект для хранения, как с использованием единой таблицы, так и с использованием нескольких таблиц (с использованием 50 полей), результаты:
Время в секундах:
Test 1° 2° 3° 4° 5° avg
1000 insert single_table 8,5687 8,6832 8,7143 8,7977 8,6906 8,69090137389466
1000 select single table LIKE '%key%' on char(250) field 1,5539 1,5540 1,5591 1,5602 1,5564 1,556705142
1000 select single table LIKE '%key%' on char(25) field 0,8848 0,8923 0,8894 0,8919 0,8888 0,889427996
1000 select single table id = $n 0,2645 0,2620 0,2645 0,2632 0,2636 0,263564462
1000 select single table integer field < $j 0,8627 0,8759 0,8673 0,8713 0,8767 0,870787334
1000 insert multi_table 446,3830 445,2843 440,8151 436,6051 446,0302 443,023531816
1000 select multi table LIKE '%key%' on char(250) field 1,7048 1,6822 1,6817 1,7041 1,6840 1,691367196
1000 select multi table LIKE '%key%' on char(25) field 0,9391 0,9365 0,9382 0,9431 0,9408 0,939536426
1000 select multi table id = $n 0,9336 0,9287 0,9349 0,9331 0,9428 0,93460784
1000 select multi table integer field < $j 2,3366 2,3260 2,3134 2,3342 2,3228 2,326600456