Можно ли иметь таблицу с ссылочной целостностью для себя? - PullRequest
3 голосов
/ 13 мая 2011

Можно ли иметь таблицу с круглыми ссылочными ключами целостности для себя?Например, если бы у меня была таблица с именем Container

ObjectId  ParentId
1         1
2         1
3         2

ObjectId 1 ссылается на себя.Идентификаторы 2 и 3 ссылаются на их соответствующих родителей, которые также находятся в той же таблице.Было бы невозможно удалить 3 без удаления 2, 2 без удаления 1, и невозможно было бы удалить 1.

Я знаю, что я мог бы сделать то же самое, имея таблицу перекрестных ссылок, такую ​​как,

   ObjectId  ContainerId
   1         1
   2         2
   3         3

   ContainerId  ObjectId
   1            1
   2            1
   3            3

Но меня интересует первый способ сделать это больше, так как это исключит возможно ненужную таблицу.Это возможно?

Ответы [ 4 ]

4 голосов
/ 13 мая 2011

Да, с самими ссылочными таблицами все в порядке.

Это классический способ представления глубоко вложенных иерархий.

Просто установите внешний ключ от дочернего столбца к родительскому столбцу (так,значение в дочернем элементе должно существовать в родительском столбце).

3 голосов
/ 13 мая 2011

Я делал это много раз. Но имейте в виду, что если вы действительно управляете иерархиями данных, SQL плохо справляется с древовидными запросами. Некоторые поставщики SQL имеют в своем составе расширения SQL, которые могут быть полезны, но «Вложенные наборы» Джо Селко - это кошачий мяукан для этого. Вы получите много хитов в поиске.

В настоящее время я использую подход «вложенные множества» с собственной ссылкой «parentID» в качестве ярлыка для ссылок:

  • Кто мой родитель?
  • Кто мои ближайшие дети?

Остальные запросы являются вложенными множествами.

3 голосов
/ 13 мая 2011

Первый способ работает, однако, если вы пытаетесь сохранить сколь угодно глубокое дерево, рекурсивные запросы будут медленными. Вы можете посмотреть на сохранение списка смежности или другой метод (см. http://vadimtropashko.wordpress.com/2008/08/09/one-more-nested-intervals-vs-adjacency-list-comparison/).

Одна вещь, которую мы делаем, - это сохранение (в отдельной таблице) каждого объекта вместе со всеми его наследниками, а также наличие индикатора «родитель» в главной таблице, который мы используем для построения дерева в приложении.

0 голосов
/ 13 мая 2011

Цель, Джордж, не состоит в том, чтобы исключить ненужную таблицу при использовании подхода вложенных наборов с самообращением.Скорее, речь идет об иерархии, глубина которой неизвестна заранее: босс босса вашего босса.Кто знает, как глубоко может зайти это организационное дерево?Если вы заранее знаете глубину иерархии и не подвержены частым изменениям, вам лучше обойтись отдельными таблицами, потому что лучше всего избегать написания запросов к вложенным наборам.Простота лучше, чем сложность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...