2013-12-26 4 views
7

Я очень смущаюсь о двух структурах. Каковы преимущества и недостатки этой таблицы? Какой из них лучше и почему?Разница между двумя структурами таблицы

TABLE1

id,   name,  age,  birthdate,  address 
somedata1 somedata1 somedata1 somedata1  somedata1 
somedata2 somedata2 somedata2 somedata2  somedata2 
somedata3 somedata3 somedata3 somedata3  somedata3 

TABLE2

id,   col_name, col_value 

somedata name  somedata 
somedata age   somedata 
somedata birthdate somedata 
somedata address  somedata 

somedata2 name  somedata2 
somedata2 age   somedata2 
somedata2 birthdate somedata2 
somedata2 address  somedata2 

somedata3 name  somedata3 
somedata3 age   somedata3 
somedata3 birthdate somedata3 
somedata3 address  somedata3 
+0

Это действительно зависит от ваших целей. Первое лучше для ограничений типа данных, так как вы можете определить/ограничить введенные значения (т. Е. Убедиться, что это действительная дата). Второй может быть более гибким, если вы добавите больше «атрибутов» позже, так как вам не нужно будет изменять структуру таблицы. Есть больше плюсов и минусов каждого, поэтому вам действительно нужно понять, что вы хотите сделать, чтобы хранить и запрашивать данные. –

+0

В основном используется первая структура. Используйте только второй вариант, если вы изменяете атрибуты все время. –

ответ

18

Антипаттерн?

В общем случае вторая таблица anti-pattern в контексте проектирования базы данных. И, более того, оно имеет определенное имя: Entity-Attribute-Value (EAV). Есть некоторые случаи, когда использование этого дизайна оправдано, но это редкие случаи - и даже там его можно избежать.


Почему EAV плохо

целостности данных Поддержка

Несмотря на то, что такая структура, как представляется, более «гибким» или «продвинутый», эта конструкция имеет слабость.

  • Невозможно сделать обязательные атрибуты. Вы не можете сделать некоторый атрибут обязательным, поскольку атрибут теперь хранится как строка - и единственный признак, который этот атрибут не задан, - это то, что соответствующая строка отсутствует в таблице. SQL не позволит построить такое ограничение изначально - таким образом, вы должны проверить, что в приложении - и, да, запрос в вашей таблице каждый раз
  • Смешение типов данных. Вы не сможете использовать стандартные типы данных SQL. Поскольку столбец значений должен быть «супертипом» для всех сохраненных значений. Это означает, что в целом вы должны хранить все данные как необработанные строки. Затем вы увидите, как тяжело работать с датами, как с строками, каждый раз набирать типы данных, проверять целостность данных, e t.c.
  • Невозможно обеспечить ссылочную небрежность. В обычной ситуации вы можете использовать внешний ключ для ограничения своих значений теми, которые определены в родительской таблице. Но не в этом случае - это потому, что ссылочная целостность применяется к каждой строке в таблице, но не для значений строк. Итак - вы потеряете это преимущество - и это один из основных в отношении DB
  • Невозможно установить атрибуты атрибутов. Это означает, что вы не можете правильно ограничить имя атрибута на уровне БД. Например, вы напишете "customer_name" как имя атрибута в первом случае - и другой разработчик забудет это и использует "name_of_customer". И .. все в порядке, DB это пройдет, и вы закончите с часами, потраченными на отладку этого дела.

реконструкция Ряд

Кроме того, реконструкция строки будет ужасно в общем случае. Если у вас есть, например, 5 атрибутов - это будет 5 самозанятых JOIN-s. Слишком плохо для такого простого - на первый взгляд - случай. Поэтому я не хочу даже представить, как вы будете поддерживать 20 атрибутов.


Может ли это быть оправдано?

Моя точка - нет. В СУБД всегда есть способ избежать этого. Это ужасно. И если EAV предназначен для использования, то лучшим выбором может быть нереляционная база данных.

2

во втором случае (table2) это сложный и занимает много времени, чтобы найти данные, когда мы делаем запрос для него , этот случай используется, когда вы не знаете о количестве столбцов или они различаются, если у вас есть фиксированная длина столбцов, тогда используется первый случай (таблица1), потому что в этом случае данные находят быстрый путь.

1

Стол с колоннами id, name, age, birthdate, address является то, что вы используете, когда вы знаете, перед развертыванием, какую информацию хранить об объекте.

Стол с колоннами id, col_name, col_value могут быть использованы, если вы знаете только после развертывания, какую информацию хранить об объекте (например, если нетехнических люди должны быть в состоянии определить поля, которые они свистеть, чтобы захватить) , Он менее эффективен, но позволяет определять новые поля без изменения схемы базы данных.

Смежные вопросы