Это интересный вопрос, ИМХО, и ответ может зависеть от конкретной модели и реализации данных. Важнейшим фактором в этом случае является плотность данных.
Сколько каждой строки на самом деле заполнена, в среднем?
- Если большинство ваших полей всегда присутствуют, то данные сфера раздела может быть путь.
- Если большинство ваших полей пустым, то метаданные -как структура (как @JayC предложил) может быть более привлекательным.
Давайте воспользуемся случаем, о котором вы упомянули, и выполните некоторые симуляции.
В первом случае, область раздела, идея заключается в реализации разделов на основе объема или использования. В качестве примера разбиения на использование, скажем, что наиболее загруженные поля - это Model, Year, Maker и Color. Эти поля могут составлять ваш основной [CAR] стол, владелец поля идентификатора, который будет идентифицировать автомобиль исключительно. Теперь предположим, что двигатель, лошадиная сила, крутящий момент и цилиндры также используются для поиска время от времени, но не так часто. Они могут существовать на вторичной таблице [CAR_INFO_1], которая привязана к первой таблице наличием поля CAR_ID, внешнего ключа. Продолжайте создавать столько разделов, сколько вам нужно.
Advantage: Простые запросы. Вы можете объединить всю информацию об автомобиле, если вы выполняете совместный запрос (например, внутри VIEW).
Недостатком: Техническое обслуживание. Каждое новое поле должно быть реализовано в самой модели, и вам необходимо обновить модель данных, чтобы найти, где поле вам нужно на самом деле хранятся (или абстрагировать внутри вида.)
Метаданных формата гораздо более изящный, но требует больше вашего механизма базы данных. Проверьте ответы @ JayC и @Nitzan Shaked за подробностями.
Преимущества: 100% плотность данных. У вас никогда не будет пустых значений данных. Также обслуживание - новый атрибут создается путем добавления его в виде строки в таблицу идентификаторов метаданных. Структура данных также менее сложна.
Недостаток: Комплексные запросы, а также более сложные планы выполнения. Предположим, вам нужны все автомобили Ford, сделанные в 2010 году, которые являются синими. Было бы очень тривиально на первом случае:
SELECT * FROM CAR WHERE Model='Ford' AND Year='2010' AND Color='Blue'
Теперь тот же самый запрос на метаданных структурированной модели:
допускаем существование этих двух таблиц,
CAR_METADATA_TYPE
ID DESC
1 'Model'
2 'Year'
3 'Color'
и
CAR_METADATA [CAR_ID], [METADATA_TYPE_ID], [VALUE]
Запрос сам хотел бы что-то вроде этого:
SELECT * FROM CAR, CAR_METADATA [MP1], CAR_METADATA [MP2], CAR_METADATA [MP3]
WHERE MP1.CAR_ID = CAR.ID AND MP1.METADATA_TYPE_ID = 1 AND MP1.Value='Ford'
AND MP2.CAR_ID = CAR.ID AND MP2.METADATA_TYPE_ID = 2 AND MP2.Value='2010'
AND MP3.CAR_ID = CAR.ID AND MP3.METADATA_TYPE_ID = 3 AND MP3.Value='Blue'
Итак, все зависит от ваших потребностей. Но, учитывая ваше дело, мое предложение было бы форматом метаданных.
(Но сделать модель очистки первый - нет повторяющихся полей, 1: N данные об их собственной таблице вместо встроенных полей, как Color1, COLOR2, color3, такого рода вещи;))
А как насчет использования NoSQL DB, как MongoDB. Это позволит вашей схеме легко меняться (добавляя новые атрибуты). – danieln