Ответ 1
Это действительно движение к Шестой Нормальной Форме, просто люди, подобные вам, у которых нет академического или эмпирического фона, не знают (a) имя для него и (b) правила и предостережения. Такие люди реализовали то, что обычно известно как Entity-Attribute-Value или EAV. Если все сделано правильно, это нормально, и есть много тысяч медицинских систем, где есть диагностические данные и информация о дозировке в таких таблицах. Если это не так, то это один завтрак для собак, который можно использовать и поддерживать.
-
Сначала убедитесь, что у вас есть
Product
в true и full 5NF. -
Всегда используйте полную декларативную ссылочную целостность;
CHECK
иRULES
. -
Никогда не помещайте все это в одну таблицу с помощью
VARCHAR()
для значения. Всегда используйте правильные (применимые) DataTypes. Это означает, что у вас будет несколько таблиц, по одному на каждый тип данных, и нет потери контроля или целостности. -
Кроме того, любые ассоциативные таблицы (где имеется множественная ссылка на другую таблицу [например, поставщик]) должны быть отдельными.
- Я предоставляю модель данных, которая обсуждает полный контроль; он включает простой каталог, который может использоваться для проверки, а также для навигации. Вам нужно добавить все
CHECK
Constraint иRULE
, чтобы гарантировать, что данные и ссылочная целостность не будут потеряны. Это означает, например:- для столбца
CPUSpeed
, который хранится вProductDecimal
,CHECK
, что он находится в правильном диапазоне значений - для каждой таблицы
Product
CHECK
, что DataType верен для комбинацииProductType-ColumnNo
- для столбца
- Эта структура лучше, чем большинство EAV, и не совсем полный 6NF.
,
- Я предоставляю модель данных, которая обсуждает полный контроль; он включает простой каталог, который может использоваться для проверки, а также для навигации. Вам нужно добавить все
-
Сохраните все обязательные столбцы в
Product
; используйте таблицыsub-Product
только для дополнительных столбцов. -
Для каждой такой таблицы (например,
Product
) вам необходимо создать представление (пунктирная линия), которое построит строки 5NF из таблиц EAV/6NF. У вас может быть несколько просмотров:Product_CPU
,Product_Disk
. -
Не обновлять через представление. Храните все ваши обновления в транзакции в хранимой процедуре и вставляйте или обновляйте каждый из столбцов (т.е. Таблицы
Product
иsub-Product
, которые применимы для каждого конкретногоProductType
) вместе. -
Гигантский? Коммерческие базы данных (а не бесплатное ПО) не имеют проблем с большими таблицами или объединениями. Это фактически очень эффективная структура и позволяет очень быстрый поиск, потому что таблицы фактически ориентированы на столбцы (не ориентированы на строки). Если население гигантское, то оно гигантское, сделайте свою собственную арифметику.
-
Вам нужна еще одна таблица, таблица поиска для
Property
(или атрибута). Это часть каталога и основана наProductType
Лучшее решение - пойти на полную, формальную Шестой Нормальную форму. Не обязательно, если у вас есть только одна или несколько таблиц, для которых требуются дополнительные столбцы.
Чтобы быть ясным:
-
Шестая нормальная форма Строка состоит из Первичного ключа и, самое большее, одного Атрибута.
-
Это 6NF (по крайней мере для кластера таблиц Product), а затем Normalized снова (не в смысле нормальной формы) с помощью DataType, чтобы уменьшить количество таблиц (в противном случае у вас будет одна таблица для каждого атрибута).
-
Это сохраняет полное управление Rdb (FKs, ограничения и т.д.); тогда как общие типы EAV не беспокоят DRI и управление.
-
У этого также есть зачатки каталога.
Ссылка на модель данных кластера продуктов
Ссылка на IDEF1X Notation для тех, кто не знаком с стандартом реляционного моделирования.
Update
Вам может быть интересно это ▶ Обсуждение 5NF 6NF ◀. Я напишу это в какой-то момент.