2009-12-31 40 views
1

我有一個表a與主鍵id和代表的a的專用版本的表b(它擁有所有相同的特性,以跟蹤爲a做,再加上一些特定於其b -ness - 後者是所有存儲在b)。如果我決定通過b的主鍵也是a.id的外鍵來代表這一點,ba相關的術語是什麼?什麼是「附加」表的正確名稱?

真實世界的例子可能是person表,studentteacher附加表。 A student也可能是teacher(例如TA),但它們都是相同的person

我會將它稱爲a的「子表」,但我已將其用作「明細表」的同義詞,例如像採購訂單上的行。

+0

我們可以得到一個真實的例子,說明在重構之前和之後A和B會是什麼樣子? – 2009-12-31 19:14:23

+0

沒有重構,因此沒有之前或之後。 :)我只是要求設計的名稱,特別是與'a'有關的'b'。 – Kev 2009-12-31 19:22:46

回答

3

您的設計聽起來像Concrete Table Inheritance

我打電話給表B a 具體表擴展表A

關係是一對一


其他答案建議僅存儲特定於擴展表的列。這種設計將被稱爲Class Table Inheritance

+0

將它簡稱爲'b'只是'a' *的擴展*會不合適嗎? (也就是說,在SQL表格上下文中有沒有其他含義?) – Kev 2009-12-31 19:31:57

+0

是的,類表繼承是唯一的。我起初聽起來像混凝土,但糾正了尼爾的答案讓我意識到我沒有清楚地描述它。 – Kev 2009-12-31 19:35:36

+0

當然,你的替代措辭是好的。有關如何很好地使用這些模式的更多信息,請參閱Martin Fowler的書PofEAA。 – 2009-12-31 19:41:39

1

好吧,這是一個脫離主題,但首先,爲什麼B具有所有的A列?它應該只有添加列,特別是如果您使用foriegn鍵引用A.

「添加上」的記錄,通常被稱爲「詳細信息(S)」

例如,可以說我的表A是「汽車總動員」我的表B將是「CarDetails」

+0

對不起,我不清楚我的措辭,我要編輯它。 – Kev 2009-12-31 19:14:59

+0

這不是一個細節表,因爲FK *是PK。這是1:1的關係,而不是M:1。 – Kev 2009-12-31 19:21:23

+0

它的1:1或1:M仍然是一個細節表。 – 2009-12-31 20:25:38

0

尼爾N表示,如果您通過外鍵引用表B中的表A,則不應在兩個位置都有列。

你的描述聽起來有點像平行於面向對象編程中的繼承。就我個人而言,在這種情況下,我沒有使用任何特定的命名約定。我名字是什麼,我叫B它是什麼。例如,我可能有:

CREATE TABLE People 
(
    people_id  INT    NOT NULL, 
    first_name  VARCHAR(40)  NOT NULL, 
    last_name  VARCHAR(40)  NOT NULL, 
    ... 
    CONSTRAINT PK_People PRIMARY KEY CLUSTERED (people_id) 
) 
GO 

CREATE TABLE My_Application_Users 
(
    people_id   INT    NOT NULL, 
    user_name   VARCHAR(20)  NOT NULL, 
    security_level  INT    NOT NULL, 
    CONSTRAINT PK_My_Application_Users PRIMARY KEY CLUSTERED (people_id), 
    CONSTRAINT UI_My_Application_Users_user_name UNIQUE (user_name) 
) 
GO 

這僅僅是一個例子,所以請不要告訴我,我的名字列過長或過短,或者他們應該允許空值,等等;)

+0

我沒有他們兩個。 'b'只具有'b'特有的內容,再加上FK/PK返回'a'以獲得更一般的信息。 – Kev 2009-12-31 19:25:21

+0

是的,它非常像OOP繼承。 – Kev 2009-12-31 19:26:10

0

b關於a的正確術語是什麼?

B是表A(父)的孩子,因爲爲了使記錄在孩子的存在,它必須首先在父存在。

表應根據要麼有一個一對多或者根據上下文多到一對一的關係進行建模,以及這些選項,他們可以是可選的還是必需的。將兩組列表鏈接在一起的表格將以涉及的每個表以多對一的方式與其他表格相關聯。例如,users,groupsuser_groups_xref - user_groups_xref可以支持許多特定用戶實例的user記錄,並且與groups表具有相同的關係。

有一個一對一的關係是沒有意義的 - 這不應該被允許存在,因爲它應該只有一個表。

+0

有一點。一個「人」可能不是「學生」 - 那麼爲什麼還要在「人」中列出學生數據的列呢?如果你有幾種類型的專業化,你的表格很快就會有很多列,通常很少。這更有組織。或者如果您按照Bill的鏈接進入混凝土路線,最終會導致數據重複,並且不得不擔心同步問題。 – Kev 2009-12-31 19:39:33

+0

@Kev:這是一個類型代碼列(帶有外鍵)。或者可以將關係建模爲與用戶/組類似。這完全取決於業務規則。 – 2009-12-31 19:40:21

+0

如果「人」能夠超過一種專業類型,則不適用。 – Kev 2009-12-31 19:41:44

相關問題