2010-01-16 63 views
4

我試圖設置一個鏈接來自不同表格的兩條記錄的表格。這些鏈接本身需要與另一個表相關聯。所以此刻,我的表是這樣的:在SQL中創建「重複字段」的最佳方式是什麼?

 
link_id (primary key) 
item_id_1 (foreign key) 
item_id_2 (foreign key) 
link_type (metadata) 

然而,項目之間的鏈接不定向(即它應該沒有什麼區別一個項目是否是第一或鏈接第二上市)。理想情況下,我希望item_id字段只出現兩次;因爲它是我必須小心總是檢查重複,以確保從14到12已經存在連接12到14從來沒有創建記錄。

有沒有一個優雅的數據庫設計解決方案,或者我應該只是採用一個約定(例如,id_1總是小ID號)和警察複製內的應用程序?

在此先感謝!

+0

強制執行'item_id_1 benzado 2010-01-16 20:46:36

回答

1

Benzado已經指出了這一點 - 添加在施行約束該item_id_1 < item_id2:

ALTER TABLE t ADD CONSTRAINT CH_ITEM1_LESSTHAN_ITEM2 CHECK (item_id_1 < item_id_2) 

因此,這將防止輸入錯誤的數據,拒絕這樣的更新/插入。

如果你想自動糾正任何情況下item_id_1> item_id_2,你可以添加一個觸發器(技術上你可以有兩個,但是你可能有一些麻煩讓它正常工作,因爲檢查約束可以檢查觸發器觸發之前)。觸發器的確切語法取決於您的RDBMS。

4

您可以使用連接表。

表1:link_id(PK),LINK_TYPE
JoinTable:table1_link_id,ITEM_ID(複合主兩者的ID構成鍵)

+0

@ rayd09:這可以工作,但有其自身的複雜性。這裏最大的問題是強制您只能創建一個鏈接,以便在「連接表」中確實存在兩個相應的項目。在查詢這個表時,會出現另一個問題,假設這些表與您的建議完全相同:因爲「連接表」沒有它自己的ID,所以在item_id1和item_id2被允許的情況下,您無法區分鏈接的兩條「腿」等於。 – 2010-01-16 21:27:03

1

有幾種實現方法。其中一個是檢查約束和唯一約束的組合。

alter table t23 
    add constraint c1_c2_ck check (c1 < c2) 
/
alter table t23 
    add constraint t23_uk unique (c1, c2) 
/

這將適用於大多數DBMS風味。另一種方法,這將在甲骨文的工作至少是使用基於函數的索引....

create unique index t23_uidx on t23 
    (least(c1,c2), greatest(c1,c2)) 
/
相關問題