2013-07-11 35 views
-1

我有一個表中有節點。我想要有不同的這些節點組,所以如果我想刪除節點,我也可以根據需要刪除整個組。在SQL表中引用其他行的最佳方式是什麼?

這樣做最好的方法是什麼?

我想也許用group ID做一個表,並在每個節點中添加一行說明它屬於哪個組ID,但這似乎並不是對我做的最好方法。

任何想法將是巨大的,

感謝

回答

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_ID刪除節點或刪除組本身,這將刪除所有孩子NODEs。

如果您需要將NODE分配給不同的GROUP,則需要第三個表,例如將GROUP_ID鏈接到NODE_ID的GROUP_NODE,但我不認爲你想要。

0

你可以有3個表,一個是你的節點,一個是你的組和一個用於您的組成員。喜歡的東西:

Nodes 
----- 
id (pk) 
name 

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

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

這將允許你分配給多個組節點(一對多的關係),也將讓您輕鬆找出哪些節點屬於給定的組。

+0

這個主鍵會是什麼? – user1857900

+0

在Node表上,它將是NodeGroup表上的id,它將是NodeId和GroupId的組合 – StevieG

1

如果關係的基數是零到許多

  • 給節點表的外鍵組表
  • 使外鍵列(S)爲空的

如果關係的基數是一個一對多(意味着節點必須屬於一個組),

  • 給節點表的外鍵組表
  • 使外鍵的字段不可爲空
  • 如果節點與組之間的關係的性質是
    • 識別。這意味着依賴實體(節點)是基於包含實體(組)的存在而預測的。它可能不會從一個包含實體移動到另一個實體。如果是這樣,請將外鍵列作爲節點表的主鍵的一部分。
    • 無法識別。這意味着依賴實體(節點)的存在不依賴於特定包含實體(組)的存在。它可能從一個包含實體移動到另一個實體。如果是這樣,則外鍵列應獨立於節點表的主鍵。

如果節點與組之間的關係的基數是許多一對多,那麼你必須引入一個關聯實體混進去,因爲許多一對多關係都沒有直接由關係模型支持。這表看起來就像這樣:

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條款,適當的外鍵。

簡單!

相關問題