2011-11-01 48 views
2

最初我被導入從Excel文檔從食物來源的食品1並且它有VARCHAR型初級* (PK示例#FOOD0001)*(因爲只有1源在我剛剛直接導入到食物表自動遞增INT ID的時間)數據庫設計:從多個數據源的主鍵

但我需要從其他來源食物源2具有完全的主鍵類型的進口食品(INT)(PK例子#25928747)

我目前有:

食品表

INT FoodId<PK>,名稱

份量表

IN牛逼ServingId<PK>FoodId<FK>,名稱,大小

什麼是最好的數據庫設計,使任何食物來源可能是進口的,不會影響目前的IDS或者至少有一個映射,使食物可以很容易地更新,刪除等?我不想將ID更改爲VARCHAR出於性能原因

我的一個想法是在我的食物表中引入FoodSourceFoodId,該食物表具有來自食物來源的原始ID,那樣如果食物被改變/從食物來源更新,那麼它可以很容易地在食物表中更新?

食品表

INT FoodId<PK>, *VARCHAR FoodSourceFoodId*, Name 
     1    #FOOD0001    Food 1 
     2    #FOOD0002    Food 2 
     3    25928747    Food 1 
     4    25928748    Food 2 

同樣地,我可以做同樣的事情的份量表,其中服務ID可能涉及到的服務ID源數據

你認爲這是去哪裏?或者你會建議別的嗎?

+0

是否有一個令人信服的理由來保持源系統中沒有意義的主鍵? 「名稱」不是「你」的重要,獨特的屬性嗎? –

+0

我需要無意義的主鍵的原因是,有時食物從食物來源更新,所以我不知道如何將食物1與主鍵1映射到#FOOOD001等等,這是更多的維護理由沿着軌道 – DotnetShadow

回答

1

這似乎是一個很好的計劃。另一個更常見的選擇是將INT FoodID作爲外鍵(對食品表)和VARCHAR ID製作支持表。然後,當你不再需要支持進口時,你可以拋開桌子。

2

我會推薦反對來自同一列中兩個不同類型(域)的建模值,特別是當有問題的類型映射到不同的SQL數據類型時。

建議:對於每個來源和單個「超類型」表,使用包含其各自的「自然」鍵的「子類型」表,以便使用人工密鑰FoodId(例如,

CREATE TABLE Foods 
(
FoodId INTEGER NOT NULL UNIQUE, 
Name CHAR(6) NOT NULL 
    CHECK (Name IN ('Food 1', 'Food 2')), 
UNIQUE (Name, FoodId) 
); 

CREATE TABLE Foods1 
(
FoodId INTEGER NOT NULL UNIQUE, 
Name CHAR(6) NOT NULL 
    CHECK (Name = 'Food 1'), 
FOREIGN KEY (Name, FoodId) 
    REFERENCES Foods (Name, FoodId) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
Food1_ID CHAR(9) NOT NULL UNIQUE 
    CHECK (Food1_ID LIKE '#FOOD[0-9][0-9][0-9][0-9]') 
); 

CREATE TABLE Foods2 
(
FoodId INTEGER NOT NULL UNIQUE, 
Name CHAR(6) NOT NULL 
    CHECK (Name = 'Food 2'), 
FOREIGN KEY (Name, FoodId) 
    REFERENCES Foods (Name, FoodId) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
Food2_ID INTEGER NOT NULL UNIQUE 
);