Как создать базу данных для неизвестного количества мета-данных - PullRequest
2 голосов
/ 14 января 2009

Я хочу хранить определенные элементы в базе данных с переменным количеством свойств.

Например:

Элемент может иметь свойства 'url' и 'pdf', остальные не имеют свойств 'image' и 'location'.

Итак, проблема в том, что некоторые предметы могут иметь некоторые свойства, а другие - много.

Как бы вы создали эту базу данных? Как сделать его доступным для поиска и повышения производительности?

Как будет выглядеть схема?

Спасибо!

Ответы [ 9 ]

8 голосов
/ 14 января 2009

То, что вы ищете, имеет имя - Значение атрибута сущности (EAV) . Это "модель данных, которая используется в обстоятельствах, когда количество атрибутов (свойств, параметров), которые могут использоваться для описания вещи (" сущности "или" объекта "), потенциально очень велико, но число это действительно относится к данной сущности относительно скромно. "

2 голосов
/ 15 января 2009

Если вы не обязательно связаны с SQL, тройное хранилище предназначено именно для этой задачи. Большинство из них предназначены для запросов на языке запросов SPARQL .

1 голос
/ 14 января 2009

Звучит как идеальная работа для базы данных документов.

0 голосов
/ 17 января 2009

Модель значения атрибута сущности (EAV) очень гибкая. Семантическая сеть и ее язык запросов sparql также основаны на EAV. Но некоторым людям это не нравится, потому что с этой моделью снижается производительность.

Начните с выполнения некоторых тестов производительности с высокой нагрузкой в ​​вашей базе данных. Не делайте их, когда закончите кодировать, потому что тогда будет слишком поздно.

edit: Сосредоточьтесь на скорости выбранных вами утверждений. Пользователи ожидают быстрых результатов при поиске.

0 голосов
/ 15 января 2009

Для этого сценария я использую столбец типа XML в MS SQL 2005 ... у вас будут все преимущества XML + SQL. То есть использовать выражение XPath как часть SQL-оператора.

Это особенность MS SQL 2005, я не уверен, какие другие СУБД поддерживают это. Я не уверен, что это влияет на производительность.

0 голосов
/ 14 января 2009

Начните с вашего объекта (предмета) и создайте таблицу для предметов. У вашего предмета может быть 1 или много атрибутов, или их вообще нет? Так что настройте таблицу атрибутов с уникальными идентификаторами. Теперь создайте таблицу, которая содержит много элементов (некоторые могут дублироваться) и множество атрибутов (также могут дублироваться)

Пункт

ItemID

ItemDescription ...

Атрибуты

AttributeID

AttributeDescription ...

ItemAttributes

RowId

ItemID

AttributeID

Теперь, когда вы хотите сделать запрос, вы можете просто объединить таблицы и отфильтровать их по своему желанию ...

0 голосов
/ 14 января 2009

выглядит как таблица "items" с первичным ключом "item_id", таблица "properties" с первичным ключом "property_id" и внешним ключом "item_id" с таблицей "items" «Свойства» будут иметь столбцы «имя» и «значение», оба типа varchar.

производительным? Не знаю.

0 голосов
/ 14 января 2009

В прошлом я создавал такие таблицы, чтобы в них были следующие поля:

  1. ID
  2. тип
  3. подтип
  4. значение * * 1 010

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

Это не красиво, и ты не хочешь этого делать, если не обязан. Но это лучший способ, который я нашел, когда ты это делаешь.

обновление: даже если вы оставите подтип пустым, я считаю, что это полезно, потому что слишком часто вы хотите подкатегоризировать то, что уже существует. Например, вы создаете тип: адрес, теперь вам нужно почтовый адрес и платежный адрес и физический адрес.

0 голосов
/ 14 января 2009

Создайте таблицу свойств со следующими полями:

item_id int (или любой другой тип идентификатора в таблице элементов) имя свойства varchar (500) property_value varchar (500)

Установите внешний ключ между item_id и полем id элемента, и все готово.

Вот как вы делаете отношения «многие-к-одному» в SQL.

...