2009-07-13 19 views
0
create table A (
    id int(10) not null, 
    val1 varchar(255), 
    primary key (id) 
); 

方法[A]:我是否需要在一對多關係中使用代理鍵?

create table B (
    a_id int(10) not null, 
    val2 varchar(255), 

    foreign key (a_id) references A(id) 
); 

方法[B]:

create table B (
    id int(10) not null, 
    a_id int(10) not null, 
    val2 varchar(255), 

    foreign key (a_id) references A(id), 
    primary key (id) 
); 

通過選擇並[a],我能避免在表中的 「ID」 代理鍵的創建「B 」。從建模角度創建表'B'的首選方法是哪一種?

+0

我想在這裏建模一對多的關係。但即使選項[a]與您的陳述相反,我也可以在'B'中爲'A'中的條目創建多行。因此,混亂? – Joe 2009-07-13 07:31:56

回答

0

據我所知:在[a]中,你創建了1:1的關係,在[b]中你不是。 他們不是替代品!

在[b]的情況下,如果表A可以存儲發票,則表B可以用於invoicelines,而在[a]這不能,因爲表A中每個記錄只能有一個記錄。每張發票1個invoiceline)

所以,如果你真的想要一個答案,用[b],你的[A]構建可以用一個表只能更換,可能不是你的意思。 (也因爲你沒有設置主鍵,在1一樣的FK:1的關係)

+0

這似乎並非如此,因爲a_id既不是主要的也不是唯一的。兩種解決方案都是一樣的。 [b]允許使用其ID來唯一標識表B中的記錄。在[a]中,除了使用val2之外,不能唯一地識別並因此操縱單個記錄,這也不一定是唯一的。 – 2009-07-13 07:32:50

+0

@malach,感謝您的提示。猜猜我忽略了這樣一個事實,即如果沒有唯一的主鍵,我將無法修改表'B'中的單個記錄。 – Joe 2009-07-13 07:36:29

1

對於代理鍵在一般情況下,

在我的計算機科學教授當然說「不」。

對我來說,實踐經驗說,是的。

爲了方便閱讀SQL語句,儘管增加了空間,但我更願意使用一個,並且在需求更改的情況下具有更大的靈活性。

+0

這不是問題。但就針對代理鍵的情況而言,它與增加的空間無關。 (不是我反對他們) – Peter 2009-07-13 07:26:22

+0

那麼,太空的副主席教授並不是那麼大的擔心,當我爲設計提供代用鍵時,他說「不」,這更多的是設計的正確性,我認爲這是主要的爭議問題。 – Extrakun 2009-07-13 07:52:50

4

你永遠需要代理鍵(因此它的名字)。看起來你在混合一個邏輯模型和一個物理模型。爲了您的邏輯模型,你大概會有

CREATE TABLE A (
    Val1 varchar() not null, 
    constraint PK_A KEY (Val1) --? 
) 

CREATE TABLE B (
    Val1 varchar() not null, 
    Val2 varchar() not null, 
    constraint PK_B KEY (Val2), --? or Val1,Val2? 
    constraint FK_A FOREIGN KEY (Val1) references A 
) 

(以虛構的SQL以上,但希望你明白這一點)現在

,對於一個物理模型,你可以在任何地方做介紹代理人感 - 邏輯鍵長的地方(例如varchars)。但是不管你是否真的取決於你。並記住要執行邏輯鍵仍然

+0

+1用於提及代理鍵和物理模型。邏輯設計不應該使用代理鍵。 – gbn 2009-07-13 08:18:49

相關問題