簡體   English   中英

簡單的MySQL表設計

[英]Simple MySQL table design

我想我應該算作數據庫新手,所以把這個問題看成是一個新手問題。 我目前創建了一個表,它包含許多主機的環境變量,如下所示:

create table envs ( 
  host varchar(255), 
  envname varchar(255), 
  envvalue varchar(8192), 
  PRIMARY KEY(host, envname)
);

非常簡單,一張表包含我需要的所有數據。 常見操作是獲取給定主機的所有環境變量,另一個是獲取給定主機的給定環境變量,第三個示例操作是獲取所有主機的給定環境變量並列出重復項。

性能預計不會成為問題,它可能是數十台主機,每台主機數十個變量,平均每秒最多1次查詢。

現在我已經讀過,擁有復合主鍵並不一定是個好主意。 對於上述用例,這是真的嗎? 如果是這樣,我該如何更改數據庫設計? 如果沒有,上面的單表數據庫是否適用於我上面列出的目的?

我沒有看到主鍵的問題。 主鍵的語義是唯一地標識鍵值的非鍵屬性值。 我假設對於一個主機和一個envname,最多只有一個envvalue,主鍵很有意義。

可能有些人反對復合主鍵,因為他們害怕性能問題。 但是,性能考慮永遠不應影響主鍵的選擇。 許多數據庫系統自動為主鍵創建索引結構; 這種指數結構的選擇會影響績效。 但是,這種選擇大多可以手動更改,如果確實存在性能問題,應該在以后完成。

您的單桌設計和主鍵選擇都很好。

現在我已經讀過,擁有復合主鍵並不一定是個好主意。 對於上述用例,這是真的嗎?

否。在(host, envname)上使用復合主鍵。

如果是這樣,我該如何更改數據庫設計?

N / A。

如果沒有,上面的單表數據庫是否適用於我上面列出的目的?

是的:它被稱為實體 - 屬性 - 值模型

這是一個糟糕的主意,因為你存儲唯一值(主機,ENVNAME) 幾次

如果您要將主機名從srv01更改為* srv01_new *怎么辦? 您必須更改表中srv01的 每個發生次數 如果有一天你決定需要創建一個包含每個主機的附加信息的新表,那該怎么辦呢?

現在,如果更改主機名,則還必須更改這些信息。

提出你的問題:這不是性能問題,而是規范化問題

數據庫通常應盡可能標准化。 如果您足夠感興趣, 請繼續閱讀

您應該為主機創建一個表,其中唯一的id (int)作為主鍵,唯一(索引) 名稱作為主機名。

然后,您的表應僅引用主機的ID ,而不是名稱 這樣,您的主機名只會在整個數據庫中存儲一次 ,並且可以更改為您想要的任何內容,而不會破壞其他表。


如果您的環境名稱也是唯一的,則應為這些創建另一個表,其布局與hosts表(id,name)相同。

然后,組合表將存儲主機ID和環境ID以及值。 您當然必須保留組合的主鍵,因此主機/環境的每個組合都是唯一的且易於索引。

然后,您與其他屬性和完美規范化具有多對多關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM