mysql - 在设计表时需要理论帮助

时间:2015-03-05 12:37:09

标签: php mysql sql

我正在构建一个文档控制表。在最简单的形式中,文档具有以下结构:

doc_id (Primary Key)
name
doc_type 
doc_category

doc_types有两种类型,链接或blob。如果它是一个blob,它将拥有自己的doc_category集合,如果它是一个链接,它将有一组不同的类别。

例如

doc_type = blob, doc_category = [photo,certificate]
doc_type = link, doc_category = [procedure, certificate]

设置关系表的最佳方法是什么?为了确保为blob分配了正确的doc_category值,这是否需要在business / php逻辑中完成,还是可以在mysql中执行此操作?如果是这样的话?有更好的方法吗?

最后,出于工作流原因,blob和链接都需要具有公共doc_id,因此将它们分离为具有自己的主键的单独表将不起作用。对此有任何建议非常感谢。

1 个答案:

答案 0 :(得分:2)

如果我理解你想制作类别树。 所以你需要表格:

category_id (Primary key)
parent_id  (Relation to category_id if parent_id = 0 then this category the root)
category_name

doc_id (Primary key)
category_id (foreign key)
doc_name
doc_content

您需要从文档中单独的类别树。要选择您可以使用的类别:

-- select categories
SELECT * FROM  categories WHERE parent_id = :category:
-- select documents
SELECT * FROM documents WHERE category_id = :category:
-- select documents with categories
SELECT * FROM documents d INNER JOIN categories c ON  d.category_id = category_id WHERE d.category_id = :category:

如果您想要包含类别的文档。您可以使用结构:

documents:
    document_id (Primary key)
    category_id (Relation to category_id if = 0 then this document is main)
    document_name
    document_content

categories:    
    category_id (Primary key)
    document_id (foreign key to main document)
    category_name

您可以选择包含类别的文档:

SELECT * 
FROM documents main_doc 
   LEFT JOIN categories c ON main_doc.document_id = c.document_id
   LEFT JOIN documents doc_in_cat ON c.category_id = doc_in_cat.category_id
WHERE
  main_doc.doc_id = :document: