2014-10-16 36 views
0

我幫朋友設計了一個數據庫,但我很好奇,如果有拇指以下一般規則:當用一個ID替換數據庫列,而不是

TABLE_ORDER

  • ORDERNUMBER
  • 訂單類型

列訂單類型具有從訂單類型的預設列表到來的可能性。我應該允許在OrderType列中使用VARCHAR值(例如生產訂單,銷售訂單等等)還是應該將它分隔到另一個表中,並將其引用爲外鍵而不是TABLE_ORDER,如下所示?:

TABLE_ORDER

  • ORDERNUMBER
  • OrderTypeID

TABLE_ORDER_TYPE

  • ID
  • 訂單類型

回答

1

如果訂單類型列表設置,並且不會改變,你可以選擇不要,讓一個單獨的表。但在這種情況下,請勿使其成爲VARCHAR,而是將其設爲ENUM

您可以更好地爲此編制索引,並且最終可以得到與使用查找表進行編號時相同類型的數據庫。

但是,如果有任何變化,你需要添加類型,只需要第二個。您可以在以後添加界面,但你可以很容易地使「讓所有類型的」之類的網頁等

0

在一個完美的世界裏,可以包含重複數據應該是一個ID或ENUM任何列。這有助於確保數據始終在內部一致,並且可以減少數據庫大小並加快查詢速度。

對於像這樣的結構,我可能會創建一個master_object表,您可以使用多種類型的表。 OrderType將引用master_object表。然後,您可以使用相同的表格來處理其他數據。例如,假設您有另一個表格 - Payments,並帶有一列PaymentType。您可以使用master_object表來存儲該列的值和元數據。這不需要強制你創建一堆小表,每個小表包含2-10行,這給了你相當大的靈活性。

布賴恩

+0

你的第一段是離開牆。使用「id」和「ENUM」隱含的數據完整性約束可以在沒有這些條件的情況下很好地實現。以這種方式取代每一個重複的專欄甚至不可能更不用說「完美」或者甚至是合理的。 – sqlvogel 2014-10-17 15:09:35

1

我會說使用另一臺說「ReferenceCodes」,例如:

類型,名稱,描述,代碼

然後,你可以使用代碼通過了數據庫和必要性不用擔心與該代碼關聯的名稱。如果您使用的名稱(在您的案例訂單類型),如果是真的很難後來改名字。這是我們在系統中實際做的。

0

如果列表很小(少於10個項目),那麼您可以選擇將它建模爲第一個,但是將列約束設置爲將輸入限制爲列表中的值。這會強制條目屬於您的列表,但您的列表不應該經常更改。

例如檢查('Val1','Val2',...'Valn'中的order_type)

如果列表將不斷變化,如果它在多個表中使用,則需要支持多種語言或任何其他設計標準這需要變化性,然後創建你的類型表(這個選擇你總是安全的,這就是爲什麼它是最常用的)。

您可以收集所有這些表變成了「代碼」表一般化的概念

CREATE TABLE Codes (
Code_Class CHARACTER VARYING(30) NOT NULL, 
Code_Name CHARACTER VARYING(30) NOT NULL, 
Code_Value_1 CHARACTER VARYING(30), 
Code_Value_2 CHARACTER VARYING(30), 
Code_Value_3 CHARACTER VARYING(30), 
CONSTRAINT PK_Codes PRIMARY KEY (Code_Class, Code_Name) 

);

insert into codes (code_class, code_name, code_value_1) 
     values('STATE','New York','NY'), 
     values('STATE, 'California','CA'), 
     ....); 

您可以再放置並根據變化的TABLE.COLUMN應該被限制在狀態列表UPDATE/INSERT觸發器。比方說,僱員表有一列EMP_STATE來存放狀態短表。

觸發會簡單地調用像

SELECT code_name 
    , code_value_1 
    INTO v_state_name, v_state_short_name 
    FROM codes 
WHERE code_class = 'STATE' 
    AND code_value_1 = new.EMP_STATE; 

if(not found) then 
    raise(some error to fail the trigger and the insert); 
end if; 

這是一個select語句可以擴展到其他類型:

insert into codes (code_class, code_name) 
     values('ORDER_TYPE','Production'), 
     values('ORDER_TYPE', 'Sales'), 
     ....); 

select code_name 
    , code_value_1 
    into v_state_name, v_state_short_name 
    from codes 
where code_class = 'ORDER_TYPE' 
    and code_name = 'Sales'; 

這最後一種方法,雖然一般適用可以使用過度。它的缺點是不能使用不同的數據類型(code_name,code_value_ *)。

一般的經驗法則是:創建一個'TYPE'(例如ORDER_TYPE)表(用來保存你想要限制每種類型的屬性的值),使用一個ID作爲主鍵,使用一個序列來生成所有這樣的ID(用於所有'TYPE'表)。許多TYPE表格可能會混淆你的模型,但是你的開發者的意思是清楚的(最終目標)。

相關問題