引用SQL表中其他行的最佳方法是什么?

时间:2013-07-11 16:15:20

标签: sql database-design

我有一个表中有节点。我想拥有这些节点的不同组,这样如果我想删除一个节点,我也可以根据需要删除整个组。

关于这个问题的最佳方法是什么?

我想可能会创建一个包含组ID的表,并在每个节点中添加一行,说明它属于哪个组ID,但这似乎不是对我这样做的最佳方法。

任何想法都会很棒,

感谢

3 个答案:

答案 0 :(得分:1)

与您提议的相似:

1) Create a GROUP table, with a GROUP_ID primary key
2) Create a NODE table, with a foreign key to NODE_GROUP
3) Define the foreign key relationship as DELETE CASCADE

如果要删除GROUP中的所有节点,则可以删除具有给定GROUP_ID的NODE,也可以删除GROUP本身,这将删除所有子NODE。

如果您需要将NODE分配给不同的GROUP,那么您需要第三个表格,例如GROUP_NODE将GROUP_IDs链接到NODE_IDs,但我认为你不想这样。

答案 1 :(得分:1)

如果关系的基数为零对多

  • 为节点表提供组表的外键
  • 使外键列可以为空(

如果关系的基数是一对多(意味着一个节点必须属于一个组),

  • 为节点表提供组表的外键
  • 使外键列不可为空
  • 如果节点和组之间关系的性质是
    • 识别。这意味着依赖实体(节点)基于包含实体(组)的存在。它可能不会从包含实体的实体移动到另一个实体。如果是,请将外键列作为节点表主键的一部分。
    • 非识别。这意味着依赖实体(节点)的存在不依赖于特定包含实体(组)的存在。它可以从一个包含实体移动到另一个实体。如果是,则外键列应独立于节点表的主键。

如果节点和组之间关系的基数是多对多,那么你必须在混合中引入一个关联实体,因为多对多

create table dbo.GroupNode
(
  group_id int not null ,
  node_id  int not null ,

  constraint GroupNode      primary key ( group_id , node_id ) ,
  constraint GroupNode_FK01 foreign key references dbo.Node( node_id ) ,
  constraint GroupNode_FK02 foreign key references dbo.Group( group_id ) ,
)

最后,如果您希望在删除节点或组时依赖实体实例消失,请将on delete cascade子句添加到相应的外键中。

容易!

答案 2 :(得分:0)

您可以有3个表,一个用于您的节点,一个用于您的组,一个用于您的组成员身份。类似的东西:

Nodes
-----
id (pk)
name

Group
----------
id (pk)
name
description

NodeGroup
----------
groupId (pk)
nodeId  (pk)

这将允许您将节点分配给多个组(一对多关系),并且还可以让您轻松找出属于给定组的节点。