-1

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

解决此问题的最佳方法是什么?

我想也许可以制作一个包含组 ID 的表,并在每个节点中添加一行,说明它属于哪个组 ID,但这对我来说似乎不是最好的方法。

任何想法都会很棒,

谢谢

4

3 回答 3

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子句添加到适当的外键。

简单的!

于 2013-07-11T17:15:47.257 回答
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 本身,这将删除所有子节点。

如果您需要将节点分配给不同的组,那么您将需要第三个表,例如 GROUP_NODE,它将 GROUP_ID 链接到 NODE_ID,但我认为您不希望这样。

于 2013-07-11T16:25:14.530 回答
0

您可以有 3 张表,一张用于您的节点,一张用于您的组,一张用于您的组成员资格。就像是:

Nodes
-----
id (pk)
name

,

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

,

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

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

于 2013-07-11T16:21:14.560 回答