我正在构建一个文档控制表.在最简单的形式中,文档具有以下结构:
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,因此将它们分离为具有自己的主键的单独表将不起作用.对此有任何建议非常感谢.
最佳答案 如果我理解你想制作类别树.
所以你需要表:
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: