2010-01-08 127 views
4

我一直想知道什麼是職業玩家這些ID的命名風格在SQL利弊:SQL - ID列命名

​​

爲什麼有些開發商在每個表使用「身份證」,一些加前綴用表名的一個字母或整個表名以及一個下劃線?

回答

7

這都是個人喜好。我個人使用Id只是因爲我認爲每個表作爲它自己的實體...然後當我用一個鍵引用時,它將變成CustomerId或OrderId,具體取決於表的名稱。

+0

我用同樣的方法,因爲賈斯汀,所以查詢看起來像: Customer.ID或Order.ID – Sparky 2010-01-08 14:27:47

+1

有些人喜歡用自然連接,這將不適用於此計劃。然而,由於魔鬼的工作是自然而然的,所以任何使它更難使用的命名約定可能是件好事。 – APC 2010-01-08 14:53:00

+1

IME,當你有多個id(例如外鍵)時,這個約定會崩潰,因爲你不知道'id'代表了什麼。數據類型不會幫助,所以你必須看看密鑰才能知道什麼是 – 2010-01-08 15:54:05

1

當您將每個表的主鍵命名爲「id」時,某些ORM工作「更好」。

2

使用'id'的優點是你有一個統一的字段,並且很容易記住和鍵入。

使用表名前綴id的優點在於,當頻繁使用多個表時,使用起來更容易。

cid似乎是三個選項中最差的一個,沒有其他兩個的好處。

11

主觀的,但我喜歡用命名的IDS(如CUSTOMER_ID,ITEM_ID等)

我的理由是,如果你的名字你外鍵始終如一它使連接更容易理解 - 它總是a.customer_id = b.customer_id。否則,對於使用大量連接的複雜查詢,您將擁有大量「id」列,並且它不會立即顯示出什麼結果。

ETA:

此外,如果你正在使用MySQL,你可以使用更簡單的聯接語法,如:

FROM customers INNER JOIN orders USING customer_id 
+1

如果你的表沒有被命名爲「a」和「b」,那麼不是真正的問題; Order.CustomerID = Customer.ID說同樣的事情,並有較少的冗餘...... – 2010-01-08 14:37:08

+1

@Chris - true,但是當在大型查詢中混疊表名時,事情可能會變得混亂。它也作爲一個健全的檢查,以確保你沒有加入到錯誤的桌子。 – 2010-01-08 14:51:11

+0

@EricPetroelje我只有很糟糕的經驗,因爲開發人員傾向於使用像iis這樣的真正糟糕的別名,只要我看到這個約定就是爲了避免這種方法產生的冗餘。 – Anther 2013-03-15 19:19:03

1

的第一個決定就是「身份證」或沒有,它是由驅動工具,它的操控性的SQL:

  • ORM:有些人喜歡「身份證」
  • 本地SQL:最好使用比ID更具體的東西,使人類寫SQL d不必總是以表別名作爲前綴。通過消除對別名的需求,您可以顯着縮小SQL的大小,並同時消除大量錯誤。

第二項決定,如果你使用的是需要「身份證」的ORM,就是:

  • 你可以只是ORM約束去所有列名
  • 或者你也可以命名列的人類,並創建一個單獨的視圖,將列重命名爲ORM想要的內容。這是一個工作,但如果你不僅僅是ORM查看錶(報表工具,其他ORM等),它可能是值得的。

或第二的決定,如果你不使用「身份證」,是 - 如何在關係數據庫中建立的名字:

  • 你通常沒有的情況下使用 - 這樣駝峯等不工作
  • 你要避免命名衝突
  • 你想的名字是有點直觀,而無需知道表名
  • 你想被大家一致的格式名稱
  • 所以,cid不是很好。 cache_id是最好的。
0

其他一些人已經指出:這實際上是個人偏好。

我更多的還是堅持少去了第三種方法(表foo將得到id列「foo_id」),但真的不能告訴你爲什麼;-)

第一計算策略IST,你可以重命名的優點你表,而無需重命名您的ID列以反映更改。但是,這並不是一個使它成爲教條的理由。

2

本地SQL:最好使用比ID更具體的東西,使人類編寫SQL並不總是有一個表的別名前綴。通過消除對別名的需求,您可以顯着縮小SQL的大小,並同時消除大量錯誤。

加前綴,即使有一個表名,沒有比一個更具體列名多個字符:

 
customer.id 
customer_id 

在不同的音符,因爲外鍵列引用的表,爲什麼不使用表的名稱作爲外鍵?

 
table order (
    id  SERIAL PRIMARY KEY, 
    customer INTEGER NOT NULL REFERENCES (customer) 
... 

然後我們有:

 
FROM customer INNER JOIN order ON customer.id = order.customer