Почему хранение типа «коллекция» в СУБД считается нарушением 1НФ? - PullRequest
0 голосов
/ 17 июня 2011

После этот вопрос

Википедия говорит:

http://en.wikipedia.org/wiki/First_normal_form#Repeating_groups_within_columns

Запрос типа "Какие пары клиентов разделяютномер телефона?"Сложнее сформулировать

Как это может быть трудно сформулировать?Пересечение двух множеств довольно простое.

Так почему же СУБД не обеспечивает способ хранения arraw / set / list?

Ответы [ 3 ]

2 голосов
/ 17 июня 2011

В статье вы ссылались на схемы таблиц, которые сравнивались с

Customer

Customer ID First Name Surname   Telephone Numbers
----------- ---------- -------   -----------------
123         Robert     Ingram    555-861-2025
456         Jane       Wright    555-403-1659, 555-776-4100
789         Maria      Fernandez 555-808-9633

против

Customer Name

Customer ID First Name Surname
----------- ---------- -------
123         Robert     Ingram
456         Jane       Wright
789         Maria      Fernandez


Customer Telephone Number

Customer ID Telephone Number
----------- ----------------
123         555-861-2025
456         555-403-1659
456         555-776-4100
789         555-808-9633

Во втором варианте может быть задан запрос «Какие пары клиентов используют номер телефона» (игнорируя необходимость указывать имена таблиц и полей в кавычках)

SELECT 
 a.telephone Number,
 a.Customer ID, 
 b.Customer ID
FROM 
 Customer Telephone Number a
 INNER JOIN  Customer Telephone Number b
 ON a.telephone Number = b.telephone Number

просто как пирог

Для первого проекта на самом деле не существует стандартного SQL для этого. Каждая RDMS имеет свой собственный способ анализа полей, разделенных запятыми, и обычно это королевская PITA, а не SARGable.

Если вас интересует, что может потребоваться для анализа поля с разделителями-запятыми, воспользуйтесь этим поиском SO https://stackoverflow.com/search?q=sql+comma+parse

Вы, вероятно, найдете все RDMS под солнцем в этом поиске

Обновление от комментария

Я не хотел писать через запятую напрямую, но если RDBMS может обрабатывать «коллекции» внутри, Операции SARGable все еще могут существовать

Это несколько другой вопрос. Ответ в том, что некоторые делают. Например, тип данных XML SQL Server может сделать это, и это SARGable, так как вы можете создать для них индекс.

Тип данных XML нарушает NF1? Если я правильно помню, CJ Date утверждает «нет» в «Глубинах баз данных: теория отношений для практиков», но я мог видеть, как некоторые могли бы это сделать.

1 голос
/ 17 июня 2011

СУБД поддерживают реляционную алгебру и языки, основанные на реляционной алгебре.РА оперирует отношениями, которые представляют собой наборы кортежей.Таким образом, лучший способ реализовать пересечение двух множеств - это использовать отношения, а не, например, использовать массивы или списки.Массивы и списки сильно отличаются от отношений (например, они адресуемы по позиции), поэтому для применения реляционных операций, таких как пересечение, сначала необходимо преобразовать массив или список в отношение.

http://en.wikipedia.org/wiki/First_normal_form#Repeating_groups_within_columns

В приведенном примере используется строка, разделенная запятыми, для представления списка телефонных номеров.Как указывается в статье, это не нарушает 1NF - строка с запятыми в ней по-прежнему является единственным значением.Однако, это не очень практичный дизайн, потому что это означает, что вам нужна последовательность манипуляций со строками для деконструкции отдельных телефонных номеров, чтобы сравнить их с чем-то другим.

Имейте в виду, что SQL не является действительнореляционный язык и СУБД на основе SQL не являются строго СУБД.В реальной СУБД может быть возможно использовать вложенные отношения (отношения внутри атрибутов) для наборов значений в одном атрибуте.Некоторые СУБД SQL поддерживают вложенные таблицы, но они не используются широко, поскольку синтаксис их использования более сложен, и их можно легко избежать, создав новые не вложенные таблицы.

0 голосов
/ 17 июня 2011

Объектно-реляционные СУБД делают. Они позволяют проектировать классы (например, типы CLR в MS SQL Server) и использовать их как общие типы. Таким образом, вы можете сделать список, массив, словарь или что-то в вашем классе. Но обычно этого не происходит, потому что в СУБД есть наборы, которые называются таблицами . Инкапсуляция набора значений в одно значение обычно не сказывается на производительности, потому что вы не можете использовать с ним реляционные операции (предоставляемые SQL). 1NF сложно, потому что не всегда ясно, что рассматривается как одно значение или как набор значений. В основном это зависит от того, как вы обрабатываете ваши данные.

...