2013-12-09 49 views
0

假設我有2個表。廣告系列和廣告客戶。每個表都有一些字段完全相同,如下所示(這些是不是字段完整列表,我只示出了相同的):數據庫規範化 - 相同的字段,不同的表

編輯: 作爲詢問的意見,我會更多地解釋密切的關係。 每個廣告客戶都有0到多個廣告系列。 1個廣告系列恰好屬於1個廣告客戶。還有另一張桌子,我們稱之爲「優惠」。創建新優惠時,需要增加所有計數列(campaigns.monthly_count,campaigns.total_count,advertisers.monthly_count,advertisers.total_count)。限制列是計數列不能超過的特定上限。

活動

monthly_limit (int) 
total_limit (int) 
monthly_count (int) 
total_count (int) 

廣告

monthly_limit (int) 
total_limit (int) 
monthly_count (int) 
total_count (int) 

的問題是:是不是規範化的數據庫設計,還是有更好的方式來做事?

我在想,我一次像這樣的表:

限制

campaign_id (int) 
advertiser_id (int) 
monthly_limit (int) 
total_limit (int) 
monthly_count (int) 
total_count (int) 

但這種方式所引用的列一個會總是空的,我不能使用外鍵。

或者另一種選擇可能是這樣的:

limits_campaigns

campaign_id (int) 
monthly_limit (int) 
total_limit (int) 
monthly_count (int) 
total_count (int) 

limits_advertisers

advertiser_id (int) 
monthly_limit (int) 
total_limit (int) 
monthly_count (int) 
total_count (int) 

這樣,我會寫可能很多加入的查詢但我可以使用外鍵。

是否有其他選擇,似乎更合適,如果不是這些設計哪一個最好?

P.S .:只是更具體的我正在使用MySQL InnoDB引擎。

+0

根據我的經驗,這取決於用戶界面和型號的需求。我們對實際加速應用程序的數據庫進行了歸一化處理,因爲它刪除了許多廣泛的連接。標準化正是通常應該做的,但不是必須做的。爲自己運行測試,看看哪些性能更​​好,並嘗試着眼於任何可能會潛入的項目範圍,並在稍後的日期進行更改(有時是完全不可能的) – amaster

+0

您能否更好地解釋您的情況?有必要更好地理解這些表格之間的關係。它應該是廣告系列和廣告客戶之間的一對多關係嗎?廣告客戶是否可以參與一項或多項活動,使關係成爲多對多?那些「限制」呢?廣告系列是否限制了廣告客戶的限制? – Javier

+0

@Javier我已經更新了更多的細節問題。 –

回答

0

正如你已經發現了自己,做這種方式:

campaign_id (int) 
advertiser_id (int) 
monthly_limit (int) 
total_limit (int) 
monthly_count (int) 
total_count (int) 

你有兩個主鍵。即使你僅僅使用campaign_id作爲主鍵,這也是不可能的,因爲主鍵不是空和/或唯一的約束。

你可以使用什麼是複合主鍵:

item_id (int) 
item_type (int) 
monthly_limit (int) 
total_limit (int) 
monthly_count (int) 
total_count (int) 

primary key(item_id, item_type) 

然後你就可以有一個參考表 Ref_Item_Type:

1 campaign 
2 advertiser 
3 whatever 
N ... 

那麼你可以參考複合主鍵爲外鍵,如果你想獲得所有項目,你將不必進行任何聯合/聯合。

CREATE TABLE SecondaryTable (
    AutoID int, 
    Key1 int, 
    Key2 int 
) 


ALTER TABLE SecondaryTable 
ADD CONSTRAINT FK_Whatever FOREIGN KEY (Key1, Key2) REFERENCES PrimaryTable (item_id, item_type) 
+0

不知道這是否是特定於我的問題,因爲我有2個表。在您的查詢示例中,您正在使用一個表中引用2列的外鍵。是否可以引用每個表中的1列?編輯:現在我看你做了什麼,再介紹一張表。 –

0

根據您的意見:

表廣告:

advertiser_id PK 
monthly_limit (int) 
total_limit (int) 
monthly_count (int) 
total_count (int) 

表活動,參照其所屬

campaign_id PK 
advertiser_id FK 
monthly_limit (int) 
total_limit (int) 
monthly_count (int) 
total_count (int) 

關於計數的廣告客戶,您應該用你的商業邏輯來控制它。

1

還會有另一種方法:
有一個名爲limitable-entity的基表(我的命名不令人滿意)與廣告系列和廣告客戶的一對一關係。
限制實體將執行generalization pattern in database design

enter image description here