SQL分层表中的Nulls与Guid.Empty

时间:2009-08-29 21:31:25

标签: c# sql

之情况:

我有一个包含分层记录的文件夹表。行的ID是GUID类型。表上的ParentID存储父文件夹ID:

  • ID(Guid)
  • FolderName(varchar)
  • ParentID(Guid)

问题:

插入顶级文件夹的最佳做法是什么?我应该将parentID列设为null,还是创建“顶级”记录(ID = Guid.Empty)并将该ID用于顶级文件夹?

6 个答案:

答案 0 :(得分:5)

guid.empty不是SQL值。为根级别创建ParentID null

您必须硬编码{00000000-0000-0000-0000-000000000000}以选择根值,而SQL本身知道null

select * from mytbl where parentid is null

另外,如果您正在构建父子表,请查看SQL Server 2008的新hierarchyid数据类型。它可以让您免于必须构建递归CTE以遍历您的树。

答案 1 :(得分:1)

绝对不要让列可以为空。在过去,我已经将顶级节点指向自己作为其父级,但是只要需要进行特殊检查,空guid就会大致相同。

答案 2 :(得分:0)

我要么创建一个代表root的静态guid,要么将ID分配给ParentID作为自引用来表示文件夹包含自己。

答案 3 :(得分:0)

要直接回答问题,您应该在Guid字段中使用Null值。 Sql中有两种类型的1对多关系 - 从1到多,0/1到。

正确实现这一点是在关键字段中使用空值,表示没有关系 - 换句话说,它具有零对多关系。关系回到同一个表上这一事实并没有改变这一点。

不要使用零指针 - 我认为这是不好的做法。你应该做的是捕获你的代码中零-guids的任何使用,以确保替换null值。我创建了一个数据库函数来将Guid.Empty值转换为Database Null(对于Sql Server,您没有指定db实现)。您可以将此想法用于其他数据库平台。

此处链接:http://www.ifinity.com.au/Blog/EntryId/81/Detecting-an-Empty-Guid-in-Sql-Server-in-T-Sql-Syntax

答案 4 :(得分:0)

事实上,这不仅仅是一个C#问题。大多数软件开发人员都面临这一决定。 我的选择是使用null作为顶级父级。为了这个,

场景1:如果我们在PARENTID列上不使用nullable;

1-)首先,我们应该在parentid和id列之间指定表的外键关系

2)第一个记录(顶级父母)的PARENTID必须等于自己的ID,

所以这是不好的做法,因为这会导致无限循环。

场景2:如果我们使用可空的PARENTID列;

1)大多数DBMS幸运地允许外键关系的空值。

2)这允许第一个或任何其他记录成为顶级父行,只是在PARENTID上具有空值。

所以我们不需要创建无限循环。 忘记空检查或忘记特殊值没有区别我认为。 我们已经有一个特殊值,这是空值:)

我早期使用的一些项目使用了空Guid。我在报告中看到“请选择”,“选择”等项目。因为它的顶级父母(Empty Guid)。所以我需要检查一下。

答案 5 :(得分:-2)

将null用于特殊值是一种不好的做法和反模式。

Null已经在数据库中具有无值的含义。所有数据库系统都是为此编程的(通过SQL标准,它永远不会将null操作的操作评估为true(特殊情况除外“是[not] null”)。

因此,请选择最适合您情况的特殊值并使用它。