Python Django是否支持没有外键关系的自定义SQL和非规范化数据库?

时间:2010-06-17 23:07:06

标签: python mysql django

我刚刚开始学习Python Django,并且拥有使用PHP和MySQL构建高流量网站的丰富经验。到目前为止,我担心的是Python过于乐观的方法,您永远不需要编写自定义SQL,并且它会自动在您的数据库中创建所有这些外键关系。我在构建Chess.com的最后几年中学到的一件事是,当你处理MySQL之类的东西时,不可能不编写自定义SQL,经常需要告诉它应该使用哪些索引(或避免使用) ,外国钥匙被判死刑。 Percona最强烈的建议是让我们删除所有FK以获得最佳性能。

Django有没有办法在模型文件中执行此操作?创建关系而不创建实际的DB FK?或者有没有办法从数据库级别开始,设计/创建我的数据库,然后让Django对模型文件进行逆向工程?

5 个答案:

答案 0 :(得分:1)

如果您不想要外键,请避免使用

  • models.ForeignKey()
  • models.ManyToManyField()
  • models.OneToOneField()

Django将自动创建一个名为id的自动增量int字段,您可以使用该字段来引用单个记录,或者您可以通过将字段标记为primary_key=True来覆盖该字段。

还有关于running raw SQL queries on the database的文档。

答案 1 :(得分:1)

Raw SQL就像这样简单:

for obj in MyModel.objects.raw('SELECT * FROM myapp_mymodel'):
    print obj

在模型定义时,数据库的非规范化取决于您。

您也可以使用非关系数据库(MongoDB,...)和Django NonRel

答案 2 :(得分:0)

django-admin inspectdb允许您从现有表中对模型文件进行反向工程。这只是对你的问题的非常局部的回应;)

答案 3 :(得分:0)

您可以创建model.py并避免让SQL Alchemy自动创建表格,让您根据需要定义实际表格。因此,尽管model.py中存在外键关系,但这并不意味着它们必须存在于实际表中。考虑到在MySQL中实现了多么荒谬的外键约束,这是一件非常好的事情--MyISAM只是忽略了它们,InnoDB在每一个都创建了一个非可选索引,无论它是否有意义。

答案 4 :(得分:0)

相关问题