Конструктор контента

Invizz

Новичок
Конструктор контента

Вообщем, волею судеб, реализую следующий концепт:

Юзер в админке может создать любой тип контента. Как это реализуется?
Он заходит в диалог создания раздела, пусть это будет блог.
Есть набор полей (назовем их fields). такие как Textarea, input, date и пр.
Выбираются необходимые поля, допустим:

Дата:date,
Выдержка:textarea,
Полный текст:textarea

Ну и соответственно в диалоге Blog->Create new post вываливается форма из этих трёх полей.

Но тут встал вопрос, как это хранить в базе данных?

1 вариант:

content
Код:
id | section_id | content | field_id
---+------------+---------+---------
1  | 3          | Привет  | 1
---+------------+---------+---------
а в fields иметь уже список полей и их свойства.

Плюсы:
- Универсальность
Минусы:
- Запросы при работе с контентом усложняются, куча джойнов и все такое. В принципе, это не такой большой минус, но получается слишком абстрактно

2 вариант:

Генерировать структуру таблиц для контента на ходу. Хочет юзер блог?

blogs
Код:
 id | date | excerpt | body
Плюсы:
- Обычная структура
Минусы:
- Может какие-нибудь косяки выплывут, когда уже часть контента будет забита и придется структуру поменять.


А как вы думаете?
 

Vallar_ultra

Любитель выпить :)
ИМХО лучше вторая структура, т.к. выборка из плоских таблиц всегда удобнее, а если какой-то филд имеет множественное значение, то создавать соответствующую таблицу для хранения множеств и пользовать таблицу-связку для работы с этим свойством.
 

SaNeK

Новичок
Invizz
может, это и бред, но я как-то делал следующим образом:

1. Заводишь таблицу для полей (у тебя она, по-видимому, есть).
2. В таблице с контентом делаешь поля только для фиксированных полей (title, body и т.д.).
3. Добавляешь в таблицу с контентом еще одно поле: fields_value.
4. В этом поле хранишь сериализованный массив с парами вида: id_поля => данные.

Таким образом, при добавлении этого всего дела в БД, можно без особого геморроя свернуть данные, а при распаковке - развернуть. Не знаю, правда, как это отразится на производительности и управляемости БД и приложением, но у меня получилось неплохо.
 
Сверху