2011-09-23 96 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