Relational-Theory

正確使用查找表

  • June 6, 2013

我很難弄清楚如何為何時何地在數據庫中使用查找表設置良好的界限。我看過的大多數資料都說我永遠不會有太多,但是在某些時候,數據庫似乎會被分解成很多部分,雖然它可能很有效,但它不再易於管理。這是我正在使用的一個綜合範例:

假設我有一個名為Employees 的表:

ID  LName   FName   Gender  Position
1   Doe     John    Male    Manager
2   Doe     Jane    Female  Sales
3   Smith   John    Male    Sales

暫時假設數據更複雜並且包含數百行。我看到可以移動到查找表的最明顯的東西是位置。我可以創建一個名為 Positions 的表,並將 Positions 表中的外鍵粘貼到 Position 列的Employees 表中。

ID  Position
1   Manager
2   Sales

但是,在資訊變得無法管理之前,我還能在多大程度上繼續將資訊分解為更小的查找表?我可以創建一個 Gender 表,並在單獨的查找表中設置一個 1 對應於男性,一個 2 對應於女性。我什至可以將 LNames 和 FNames 放入表中。所有“John”條目都替換為外鍵 1,該外鍵指向 FName 表,表示 ID 為 1 對應於 John。但是,如果您像這樣走得太遠,那麼您的員工表就會被簡化為一堆外鍵:

ID  LName   FName   Gender  Position
1   1       1       1       1
2   1       2       2       2
3   2       1       1       2

雖然這對於伺服器處理可能更有效,也可能不會更有效,但對於可能試圖維護它的普通人來說,這肯定是不可讀的,並且使應用程序開發人員試圖訪問它更加困難。所以,我真正的問題是有多遠?這類事情是否有“最佳實踐”或某處有一套好的指導方針?對於我遇到的這個特定問題,我在網上找不到任何真正確定一套好的、可用的指導方針的資訊。數據庫設計對我來說是老帽子,但好的數據庫設計是非常新的,所以過於技術性的答案可能會讓我頭疼。任何幫助,將不勝感激!

但是,在資訊變得無法管理之前,我還能在多大程度上繼續將資訊分解為更小的查找表?我可以創建一個 Gender 表,並在單獨的查找表中設置一個 1 對應於男性,一個 2 對應於女性。

你混合了兩個不同的問題。一個問題是使用“查找”表;另一種是使用代理鍵(身份證號)。

從這張表開始。

ID  LName   FName   Gender  Position
1   Doe     John    Male    Manager
2   Doe     Jane    Female  Sales
3   Smith   John    Male    Sales

您可以為這樣的職位創建一個“查找”表。

create table positions (
 pos_name varchar(10) primary key
);

insert into positions
select distinct position 
from employees;

alter table employees
add constraint emp_fk1
foreign key (position) 
 references positions (pos_name);

您的原始表看起來與創建“查找”表之前完全一樣。而且員工表不需要額外的連接即可從中獲取有用的、人類可讀的數據。

使用“查找”表可以歸結為:您的應用程序是否需要控制外鍵引用提供的輸入值?如果是這樣,那麼您始終可以使用“查找”表。(不管它是否使用代理鍵。)

在某些情況下,您將能夠在設計時完全填充該表。在其他情況下,使用者需要能夠在執行時向該表添加行。(而且您可能需要包括一些管理流程來審查新數據。)實際上具有ISO 標準的 Gender可以在設計時完全填充。國際線上產品訂單的街道名稱可能必須在執行時添加。

引用自:https://dba.stackexchange.com/questions/9011