Я надеюсь создать библиотеку Codeigniter, похожую на CCK Drupal, хотя и в чрезвычайно упрощенной версии. Мне интересно, какая структура базы данных будет работать лучше всего для достижения моей конечной цели, которую лучше всего описать в следующем сценарии использования:
Интерфейс:
Существующие типы контента:
- Страница [тип редактирования] [список всех] [добавить новую страницу]
- Рейтинг [тип редактирования] [список всех] [добавить новый рейтинг]
- DVD-фильм [тип редактирования] [список всех] [добавить новый DVD-фильм]
[создать новый тип контента]
Веб-разработчик нажимает [создать новый тип контента]:
Форма: новый тип контента
Введите название: [ _ Комментарий посетителя __ _ __ _ __ _ ___ ]
Добавить поле:
- Имя поля: [ _ Имя __ _ __ _ __ _ _ ]
- Тип поля: [ Текст (<128 символов) </strong>] (раскрывающийся список с основными параметрами)
- Обязательное значение: [ x ]
- [Добавить поле]
[Сохранить тип содержимого]
Веб-разработчик добавляет пару полей:
Форма: новый тип контента
Введите название: [ _ Комментарий посетителя __ _ __ _ __ _ ___ ]
Текущие поля:
- Имя | Текст (<128 символов) | требуется </li>
- Email | Текст (<128 символов) | по желанию </li>
- Содержание | Текст (<1024 символа) | требуется </li>
- ForPage | Страница | требуется
Добавить поле:
- Имя поля: [ _ __ _ __ _ __ _ __ _ ]
- Тип поля: [-выберите ниже-]
- Обязательное значение: []
- [Добавить поле]
[Сохранить тип содержимого]
Веб-разработчик сохраняет тип контента, а система создает ...... ну, что именно?
Идея 1: Я мог бы легко позволить ему создать новую таблицу БД с соответствующими полями (которая по существу сформировала бы очень элементарную систему phpmyadmin) - но разумно ли это? Разве это не засоряет базу данных множеством таблиц для этого и того?
Идея 2: Или я мог бы создать «базу данных в базе данных», что-то вроде:
table ContentType (e.g. "Book")
-- id
-- title
table CustomField (e.g. "Author Name")
-- id
-- ContentTypeID (linking the "Author Name" field to the "Book" type)
-- valueType (linking the field to the correct db table of values)
table DBRecord (e.g. "Lord Of The Rings vol.1")
-- id
-- ContentTypeID (linking the LotR record to the "Book" type)
table ValueText128 (e.g. "J.R.R. Tolkien")
-- id
-- DBRecordID (linking the value to the LotR record)
-- CustomFieldID (linking the Tolkien value to the "Author Name" field)
-- value : char(128)
table ValueSmallInt (e.g. "1954")
-- id
-- DBRecordID (linking the value to the LotR record)
-- CustomFieldID (linking the "1954" value to the "Published Year" field)
-- value : smallInt
...and so on, with a table for each of the datatypes
Возможно, это может сработать, но я подозреваю, что на практике это может быть ужасно неэффективно, учитывая, что каждое целочисленное значение из каждого элемента каждого типа во всей системе окажется в одной и той же массивной таблице - и то же самое для каждого символа ( 128) значение и т. Д.
Итак - что ты думаешь? Как CCK это делает? Что будет работать лучше?