Я разрабатываю приложение, включающее «страницы», которые имеют много «блоков», из которых есть несколько типов блоков.Однако я изо всех сил пытаюсь найти хороший способ сохранить эти данные в базе данных.Я предполагаю, что есть популярный способ сделать это, вот два, которые я рассматриваю:
Первый подход
- Таблица страниц
- id
- пользователь
- создан, обновлен и т. д.
- Blocks
- id
- page (Blocks.page = Pages.id)
- создано, обновлено
- block_type (например, "text")
- block_id (Blocks.block_id = nBlocks.id где n = block_type)
- Текстовые блоки
Преимущества этого заключаются в том, чтоатрибуты, которые являются общими для всех типов блоков (созданный, обновленный, страница, заголовок, порядок), хранятся в одном месте.Вам также не нужно было бы запрашивать каждую таблицу типа блока, чтобы проверить наличие блоков для текущей страницы, поскольку у вас был бы этот «индекс».Минусы в том, что это может немного сбить с толку при поиске блоков, но это зависит только от правильной его реализации (найти все блоки для страницы, сгруппировать по типу блока, выполнить запросы по каждому типу блока).
Подход второй
- Страницы по-прежнему
- Текстовые блоки
- id
- page
- тело, текстовые элементы
- создано, обновлено, заказ
- Список блоков
- id
- page
- элементы списка
- создано, обновлено, заказано и т. Д.
Плюсы этого - устранение запутанного способа поиска правильной таблицы для запроса для каждого блока.Минусы в том, что порядок блоков не может быть легко управляемым (update where order in any other block != $order
), и что каждая таблица должна иметь одинаковые созданные, обновленные и т. Д. Поля, что требует немного усилий, если их необходимо изменить.Более серьезная проблема заключается в том, что каждая таблица, относящаяся к конкретным блокам, должна запрашиваться для каждой страницы, а не только таблицы блоков, у которых определенно есть блоки для страницы.
Есть ли третий, лучший способ сделать это?Я думаю, что лучший подход - это первый (по крайней мере, он более нормализован, чем второй, и табличная логика не , что сбивает с толку), но я хотел бы знать, если что-то мне не хватает :)