Нули против Guid.Empty в иерархической таблице SQL - PullRequest
2 голосов
/ 30 августа 2009

Scenerio:

У меня есть таблица папок с иерархическими записями. Идентификатор строки имеет тип GUID. ParentID в таблицах хранит идентификатор родительской папки:

  • ID (Guid)
  • имя_папки (varchar)
  • ParentID (Guid)

Вопрос:

Как лучше вставлять папку верхнего уровня? Должен ли я сделать столбец parentID пустым или создать запись «верхнего уровня» (ID = Guid.Empty) и использовать этот идентификатор для папок верхнего уровня?

Ответы [ 6 ]

5 голосов
/ 30 августа 2009

guid.empty не является значением SQL. Сделайте ParentID null для корневого уровня.

Вам нужно было бы жестко кодировать {00000000-0000-0000-0000-000000000000}, чтобы выбрать корневое значение, тогда как SQL изначально знает о null:

select * from mytbl where parentid is null

Кроме того, изучите новый тип данных hierarchyid в SQL Server 2008, если вы строите таблицу Parent-Child. Это может немного избавить вас от необходимости создавать рекурсивный CTE для обхода вашего дерева.

1 голос
/ 30 августа 2009

Определенно не делайте столбец обнуляемым. В прошлом я делал узел верхнего уровня, указывающий на себя как на своего родителя, но пустой guid был бы более или менее таким же, как требующий специальной проверки.

0 голосов
/ 01 марта 2012

На самом деле это не просто вопрос C #. Большинство разработчиков программного обеспечения столкнулись с этим решением. Мой выбор - использовать ноль в качестве верхнего родителя. Ради

Сценарий 1: если мы не используем Nullable в столбце PARENTID;

1-) Прежде всего мы должны указать отношение внешнего ключа для таблицы среди столбцов parentid и id

2) PARENTID первой записи (верхнего родителя) должен быть равен собственному идентификатору,

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

Сценарий 2: если мы используем столбец PARENTID со значением NULL;

1) К счастью, большинство СУБД допускают нулевые значения для отношений с внешним ключом.

2) Это позволяет первой или любой другой записи быть верхней родительской строкой, просто имея нулевое значение PARENTID.

Так что нам не нужно создавать бесконечный цикл. Я думаю, что забыть нулевую проверку или забыть специальное значение не отличается. У нас уже есть специальное значение, это нулевое значение:)

В некоторых проектах, которые я собираю ранее, использовался Empty Guid. И я вижу в отчетах такие пункты, как «Пожалуйста, выберите», «Выбрать». Потому что его верхний родитель (пустой Guid). Поэтому мне нужно проверить это.

0 голосов
/ 06 февраля 2012

Чтобы ответить на вопрос напрямую, вы должны использовать значение Null в поле Guid. В Sql есть два типа отношений 1 ко многим - это 1 ко многим и 0/1 ко многим.

Правильная реализация этого состоит в том, чтобы использовать нулевое значение в ключевом поле, чтобы обозначить, что нет никакого отношения - другими словами, у этого есть отношение ноля ко многим. Тот факт, что отношения вернулись на одну и ту же таблицу, не меняет этого.

Не используйте нулевого гида - по моему мнению, это плохая практика. Что вы должны сделать, это зафиксировать любое использование нулевых направляющих в вашем коде, чтобы убедиться, что нулевое значение заменено. Я создал функцию базы данных для преобразования значения Guid.Empty в Нуль базы данных (для Sql Server вы не указываете реализацию db). Вы можете следовать этой идее для других платформ баз данных.

Ссылка здесь: http://www.ifinity.com.au/Blog/EntryId/81/Detecting-an-Empty-Guid-in-Sql-Server-in-T-Sql-Syntax

0 голосов
/ 30 августа 2009

Использование нулевого значения для особого значения - плохая практика и анти-паттерн.

Null уже имеет значение в базе данных, которое не имеет значения . Все системы баз данных запрограммированы для этого (через стандарт SQL, который никогда не оценивает операции с нуля до истины (за исключением специального случая "is [not] null").

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

0 голосов
/ 30 августа 2009

Я бы либо создал статическую направляющую, которая представляла бы корень, либо назначил идентификатор для ParentID в качестве самостоятельной ссылки, чтобы указать, что папка содержит себя.

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