【问题标题】:Django: Best practices for database designDjango:数据库设计的最佳实践
【发布时间】:2011-11-23 18:36:25
【问题描述】:

我正在开始一个项目,我决定使用 Django。

我的问题是关于数据库的创建。我已经阅读了教程和一些书籍,那些总是开始创建模型,然后同步数据库。我不得不说,这对我来说有点奇怪。我总是从数据库开始,定义架构,然后创建我的数据库抽象(模型、实体等)。

我检查了一些外部可插拔应用程序,这些应用程序也使用“模型优先”的做法。

我可以看到“模型优先”方法的一些优势,例如可移植性、重新部署等。

但我也看到了一些缺点:如何创建索引、索引的类型、触发器、视图、SP 等。

那么,你如何开始一个现实生活中的项目?

【问题讨论】:

  • 我计划我的数据库模式,然后通过 django 模型实现它。您可以在 django 中或通过您的数据库后端创建索引。

标签: database django database-design architecture


【解决方案1】:

触发器、视图和存储过程并不是 Django 世界的一部分。可以使用它们,但这是痛苦和不必要的。 Django 的开发人员认为业务逻辑属于 Python,而不是你的数据库。

至于索引,您可以将它们与模型一起创建(使用 db_indexunique_together 之类的东西,或者您可以稍后使用 South 之类的东西通过数据库迁移添加它们。

【讨论】:

  • +1 好答案。谢谢。现在,我问:你从来没有使用过触发器、SP 或视图吗?没有这些东西,现实世界的应用程序还能存在吗?请不要误解我,我是 Python+Django 世界的新手。我来自 Big Architectures Java Apps,我们依赖那些数据库。
  • +1 用于南方。您可以使用迁移来管理索引等,让生活变得更轻松。
  • Oracle 开发人员坚持认为,数据库设计的一个无可争辩的原则是主键应该是不可变的。他们并没有很好的理论理由来支持这种说法。恰好Oracle 不支持ON UPDATE CASCADE。如果 Django 从一开始就支持触发器、视图、存储过程、检查约束和延迟约束,我认为您的看法会有所不同。
  • @Catcall 但我根本没有说你不应该使用这些东西。我只是说 Django 并不容易,没有他们 Django 开发人员相处得很好。
【解决方案2】:

大多数情况下,我们不会为我们的模型编写 SQL(例如创建索引、创建表等),而是依靠 Django 为我们生成它。

从模型层开始设计您的应用程序绝对没问题,因为您可以依靠 Django 生成您需要的正确数据库 sql。

不过,Django 确实为您提供了各种功能来复制这些数据库功能:

  • 触发器:Django code or MySQL triggers
  • 索引:可以用db_index=True指定
  • 唯一约束:unique = Trueunique_togther = (('field1', field2'),) 用于复合唯一约束。

使用 Django 而不是编写 sql 的优点是您可以将自己从正在使用的特定数据库中抽象出来。换句话说,您可以在一天使用SQLite,然后切换到PostgresQLMySQL,这样更改会相对轻松。

示例:

当你运行这个时:

python manage.py syncdb 

Django 自动创建表、索引、触发器等,它需要支持您创建的模型。如果您不习惯 django 为您创建数据库,您可以随时使用:

python manage.py sqlall 

这将打印出 Django 为使其模型正常运行所需的 SQL 语句。还有其他sql 命令供您使用:

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

【讨论】:

  • 我认为这是对的。但是,我总是说切换数据库并不常见。我的意思是,每个人都认为这是一个很大的优势,但很少发生。好答案顺便说一句 +1
  • 对于它的价值(因为这个线程已经有 2 年多的历史了,并不多)我最近刚刚切换了两个我从 SQLite 开始的项目(所以我可以让它们在一个最小系统)出于性能/多进程原因使用 Postgres。
猜你喜欢
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
相关资源
最近更新 更多