两个表之间的onetoone数据库关系?

时间:2015-12-07 13:05:35

标签: python sql django database

我系统中已经存在4个表。

  1. 帐户
  2. 项目
  3. 文档
  4. 目录
  5. 系统中有很多帐户,每个帐户都有很多项目,每个项目都有很多文档。 [当前系统不在不同的帐户中处理相同的项目名称]

    目录表

    class catalog(models.Model):
        catalog_name = models.TextField(blank=True, null=True)
        documents = models.ManyToManyField(document, blank=True, null=True)
    

    目录表中任何项目的当前系统映射文档。 我们按catalog_name创建project_name并在document中添加文档 所以项目名称不能重复。

    项目表

    class Project(models.Model):
        FK_Account = models.ForeignKey(Account, blank=True, null=True)
        Project_ID = models.TextField(blank=True, null=True, db_index=True)
        Project_Name = models.TextField(blank=True, null=True, db_index=True)
    

    文件表

    class document(models.Model):
        uid = models.TextField(blank=True, null=True,db_index=True)
    

    获取项目文档的代码

    def getAllProjectDocument(self, project_obj, current_selected_option='All'):
        """ Returns All Project Documents.        """
        docs = []
        cat_obj_list = catalog.objects.filter(catalog_name = project_obj.Project_Name + "-user-catalog")
        if cat_obj_list:
            catobj = cat_obj_list[0]
            if current_selected_option=="All":
                docs = catobj.documents.filter(status=2)
            else:
                docs = catobj.documents.filter(status=2, publish_status=int(current_selected_option))
    
        return docs
    

    注意:状态2表示文档在项目中是任意的。

    系统中有950000个文档和300000个项目。如果我必须获得所有项目的project documents,那么我必须在catalog表上查询每个项目,即300000时间,然后再根据{filtering进行查询{1}}然后将查询集对象添加到python列表并在完成search循环后传递给模板

    所以for循环正在for次运行,然后在300000上查询相同的计数,即catalog,并再次过滤相同的计数,即“300000”。所以apache内存增加了。

    我提出了以下想法:这是数据库的迁移。

    我将创建具有一对一映射og项目和文档的表。 有4种类型的文件 - 1.私人,2。项目,3。图书馆,4。删除文件。

    300000

    那么** class Project_Document(models.Model): FK_Project = models.ForeignKey(Project, blank=True, null=True) FK_Dcoument = models.ForeignKey(document, blank=True, null=True) 映射是正确的还是有人有不同的方法来做到这一点?**

1 个答案:

答案 0 :(得分:1)

您的ProjectDocument表实际上只是一个多对多关系,与目录和文档之间的关系完全相同。我不认为添加另一个会有所帮助,特别是因为你必须确保两个关系保持同步。

相反,您应该直接在Catalog和Project之间添加缺少的关系;我不能从代码中告诉我这应该是一对多(ForeignKey)还是一对一,如果前者应该去哪个方向。但假设每个项目都有多个目录,您可以在Catalog上添加一个指向Project的ForeignKey;那么你可以通过一个查询获得项目的所有文档:

project_docs = Document.objects.filter(catalog__project=my_project)

另请注意,您的表格中存在一些效率低下的问题;你似乎整个都在使用TextFields,它们作为blob存储在数据库中,因此会产生巨大的开销。您应该使用CharFields来获取ID和名称等内容; TextFields仅适用于大块文本,例如文档本身的正文内容。