2014-03-06 43 views
2

我不太明白需要在Rails中隱藏id列的存在。 它既沒有反映在migration文件中,也沒有反映在schema.rb文件中。 新手無法知道名爲id的列已被默認創建爲primary key。 除非他們去檢查數據庫中表的實際模式(rails dbconsole)。爲什麼Rails隱藏id列的存在?

我可以看到timestamps宏默認包含在遷移文件以及schema.rb作爲兩個字段created_atupdated_at。在這裏,開發者至少得到一個線索。 Rails也可以爲id列做同樣的事情。但事實並非如此。

爲什麼在id列左右保密?它是着名的convention over configuration的一部分嗎?或者它是所有MVC框架的規範嗎?

+0

這是Rails團隊的選擇。 – wurde

+0

@wurde,但'選擇'也帶有重置'id:false'的靈活性...... – HackerKarma

+0

好的。您可以將ID設置爲false。一定要保持規範化的數據或者保證記錄的完整性。 – wurde

回答

2

在數據庫設計中人們普遍認爲數字ID是首選,因爲

  • 他們更容易索引,因而更容易「跟隨」或創建鏈接(外鍵)時檢查。
  • 當編輯/更新記錄,你有一個獨特的(和有效)標識符

所以,因此建議給所有表獨特的數字鍵,始終。

現在這個數字鍵對您的應用程序沒有任何意義,它是數據庫層的「實現細節」。還要確保每個表都有一個ID,除非你明確地要求不要。

我認爲這確實屬於「約定優於配置」nomer:爲什麼每個表都應該有一個明確指定每個表的id。

時間戳是不同的:這對一些表格很有趣,但對於同一張表格,它根本不重要。它也取決於你的應用程序。

請注意,這與MVC無關。 MVC中的M是數據的容器,但在MVC中,模型如何填充其實並不重要。換句話說:ORM部分不是MVC的一部分。你會發現在大多數MVC實現中沒有ORM,或者絕對不像Rails那樣緊密集成。簡而言之:imho從遷移中省略'id'並不是祕密,它只是爲了讓生活更輕鬆,爲您節省更多的打字費用,它確保您遵循良好的慣例,除非您明確做不是想。

+0

謝謝。 :)這是一個相當不錯的解釋,與我在想的某個地方相匹配。 –

1

這可能是因爲關係數據庫傾向於使用整數主鍵,否則會引入複雜性。我猜想它隱藏在rails中的原因是,使用整數主鍵創建表不需要任何特殊配置,並且必須將其寫入rails migrations,才能邀請沒有經驗的開發人員進行操作(這可能不是一個好主意)。如果你想在遷移中創建關聯而不需要指定外鍵,那麼你可以簡單地寫出你想要關聯的對象的名字表格。

0

我從來沒有對鑫卡特id字段,因爲幾乎每個表都有一個id ....

檢查文檔中關於migrations,他們說:

的主鍵列名爲id也將是隱含地添加,因爲它是所有活動記錄模型的默認主鍵 。時間戳 宏添加了兩列,created_at和updated_at。這些特殊的 列由Active Record自動管理(如果存在)。

如果要檢查你的表列,只是去軌控制檯,然後輸入Model.column_names

0

我認爲,很明顯,如果不添加一個主鍵,然後鐵軌將增加一個通用密鑰你這樣它可以索引你的記錄並對它進行控制,所以基本上它不會指出將會有一個ID字段,因爲我不認爲這是必須的,而是在你做的時候是可選的不提供主鍵。

0

這是一個Rails約定來隱藏我的屬性,以阻止和消除玩它的誘惑。

id attr會自動生成auto_increment,以便對您的數據進行廣告標準化(使每個記錄唯一可訪問)。注入自己的值最終會破壞並打破ActiveRecord的魔力。