2012-10-17 65 views
0

我對關係數據庫中的主鍵有疑問。讓我們假設我有以下表格:處理相關表的主鍵以節省存儲空間

  • ID
  • box_name

BoxItems

  • ID
  • ITEM_NAME
  • belongs_to_box_id(外鍵)

我們還假設我打算每天存儲數百萬個項目。對於BoxItems.Id,我可能會使用bigint或​​。

我在想什麼,我需要你的建議,而不是BoxItems的Bigint Id,使用順序TinyInt數字和什麼標識每個項目是belongs_to_box_id加上tinyint行(例如item_numner)的組合, 。

所以現在,而不是上面我們得到:

BoxItems

  • belongs_to_box_id
  • item_sequence_number [TINYINT]
  • ITEM_NAME

例子:

Items.Insert(1,1, "my item 1"); 
Items.Insert(1,2, "my item 2"); 

因此,我可以使用tinyint而不是使用bigint或GUID,並節省大量的磁盤空間。

我想知道這種方法的缺點和優點。我正在開發使用MySQL和ASP.NET 4.5

+0

你需要解釋你想要對數據做什麼。物理數據結構由應用程序需求驅動。畢竟,如果你想節省大量的空間,不要存儲任何東西。 –

回答

0

當你想想看,有沒有真正的「盒子/內容」的問題和「訂單/行項目」的問題相差無幾。

create table boxes (
    box_id integer primary key, 
    box_name varchar(35) not null 
); 

create table boxed_items (
    box_id integer not null references boxes (box_id), 
    box_item_num tinyint not null, 
    item_name varchar(35) not null 
); 

對於MySQL,您可能會使用無符號整數和無符號tinyint。數據庫沒有任何理由避免負數,但開發人員應該依靠Principle of Least Surprise

確保256值就足夠了。在每天獲得數百萬行的表格中糾正錯誤可能代價昂貴。

0

我建議寫兩種方法的一個簡單的測試,比較性能,磁盤空間和易於實施的,並做出判斷調用我的應用程序。你的兩個建議都是合理的,我懷疑在性能上會有很大的差異,但找出最好的方法是試試看,然後你就會知道。

+0

我從答案中刪除了簽名,他們不應該被包含在答案中,但可以隨意將其放在您的個人資料頁面上。 – Taryn