Django:数据库设计的最佳实践

9

我正在启动一个项目,决定使用Django。

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

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

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

但我也看到一些缺点:如何创建索引、索引类型、触发器、视图、存储过程等。

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


1
我会规划我的数据库模式,然后通过 Django 模型来实施它。您可以通过 Django 或您的数据库后端来创建索引。 - dm03514
2个回答

12

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

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


+1个好答案。谢谢。现在我问:您是否从未使用触发器、存储过程或视图?真实世界的应用程序可以没有这些吗?请不要误解我,我是Python+Django世界的新手。我来自大型架构Java应用程序,我们依靠这些数据库东西。 - santiagobasulto
1
你可以使用迁移来管理索引等内容,这样会让生活变得更加轻松。+1 如果使用“南”作为方言。 - Jack M.
Oracle开发人员坚持数据库设计的一个不可争议的原则是主键应该是不可变的。他们并没有一个好的理论依据来支持这个说法。只是碰巧Oracle不支持“ON UPDATE CASCADE”。如果Django从一开始就支持触发器、视图、存储过程、检查约束和延迟约束,我认为你的观点会有所不同。 - Mike Sherrill 'Cat Recall'
@Catcall 但我并没有说你永远不应该使用这些东西。我只是说Django并不容易实现,而且Django开发者在没有它们的情况下也能很好地完成工作。 - Daniel Roseman

7
大多数情况下,我们不会为模型编写SQL(例如创建索引、创建表等),而是依赖Django为我们生成。从模型层开始设计应用程序完全没有问题,因为您可以依赖Django为您生成所需的正确数据库SQL。
但是,Django确实提供了各种功能,以便您复制这些数据库功能:
- 触发器:Django代码或MySQL触发器 - 索引:可以使用 db_index=True 指定 - 唯一约束条件: unique=True unique_togther=(('field1', field2'),)用于组合唯一约束条件。
使用Django而不编写sql的优点是使您抽象出特定的数据库。换句话说,您今天可以使用SQLite,明天可以轻松切换到PostgresQL或MySQL。
示例:
当您运行以下内容时:
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

我认为这是正确的。但是,我总是说切换数据库并不常见。我的意思是,每个人都认为这是一个巨大的优势,但很少发生。好答案顺便加一分。 - santiagobasulto
就这个话题而言(鉴于此主题已经存在两年以上,价值不高),最近我刚刚将两个我最开始使用SQLite(以便在极简系统上轻松运行)的项目转换为使用Postgres,以提高性能/多进程方面的需要。 - Foon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接