2011-09-23 100 views
6

我開始一個項目,我決定使用Django。Django:數據庫設計的最佳實踐

我的問題是關於創建數據庫。我讀過教程和一些書籍,這些書籍總是開始創建模型,然後同步數據庫。我必須說,這對我來說有點奇怪。我一直從DB開始,定義模式,然後創建我的數據庫抽象(模型,實體等)。

我已經檢查了一些外部可插拔應用程序,以及那些使用「模型優先」練習的應用程序。

我可以看到一些優勢,爲「模型至上」的方針,如便攜性,重新部署等

但我也看到一些缺點:如何創建索引,那種索引,觸發器,意見,SP等

那麼,你如何開始一個真實的生活項目?

+1

我規劃我的DB模式,然後通過一個Django模型實現它。你可以在django或通過你的db後端創建索引。 – dm03514

+0

+1好的「mixin」。 – santiagobasulto

回答

11

觸發器,視圖和存儲過程並不是Django世界的一部分。可以使用它們,但它是痛苦的和不必要的。 Django的開發人員認爲業務邏輯屬於Python,而不屬於數據庫。

至於指標,你可以沿着創建它們與你的模型(帶之類的東西db_indexunique_together,或者您也可以通過數據庫遷移使用像南稍後添加它們。

+0

+1好答案。謝謝。現在,我問:你有沒有使用觸發器,SP或視圖?沒有這些東西,現實世界的應用程序可以存在嗎請不要誤解我,我是Python + Django世界的新手。我來自Big Architectures Java Apps,我們依靠這些數據庫的東西。 – santiagobasulto

+1

+1供南方使用。您可以使用遷移來管理您的索引等,讓生活變得更加輕鬆。 –

+0

Oracle開發人員堅持認爲數據庫設計的一個不爭的原則是主鍵應該是不可變的。對於這種說法他們並沒有很好的理論上的理由。只是碰巧Oracle不支持'ON UPDATE CASCADE'。如果Django從一開始就支持觸發器,視圖,存儲過程,檢查約束和延遲約束,我認爲您的意見會有所不同。 –

7

主要是我們不寫SQL(例如創建索引,創建表等),而是依靠Django爲我們生成它。

從模型層開始設計應用程序是絕對可行的,因爲您可以依賴它在Django上生成你需要的正確的數據庫sql。

How以往,Django的確實提供了各種功能,爲您複製這些數據庫功能:

  • 觸發:Django code or MySQL triggers
  • 指標:unique = Trueunique_togther = (('field1', field2'),)複合唯一約束:可以用db_index=True
  • 唯一的限制規定。

使用Django而不是編寫sql的優點是您可以將自己從您正在使用的特定數據庫中抽象出來。換句話說,你可能在SQLite有一天,並切換到PostgresQLMySQL未來和改變將是相對無痛的。

例子:

當你運行這個:

python manage.py syncdb 

的Django自動創建表,索引,觸發器等,它需要支持你所創建的模型。如果你不熟悉的Django創建數據庫適合你,你可以隨時使用:

python manage.py sqlall 

這將打印出SQL語句的Django需要有爲了旗下車型才能正常工作。還有其他sql命令供您使用:

見:https://docs.djangoproject.com/en/1.3/ref/django-admin/#sql-appname-appname

+0

我認爲這是正確的。但是,我總是說切換數據庫並不常見。我的意思是,每個人都認爲這是一個很大的優勢,但很少發生。很好的答案BTW +1 – santiagobasulto

+0

爲什麼它是值得的(因爲這個線程是2+歲以上,不是很多)我剛剛切換了兩個項目,我開始了SQLite(所以我可以讓他們在最小的系統上運行)使用Postgres來實現性能/多進程的原因。 – Foon