2015-03-05 2 views
4

Я строю таблицу управления документами. В простейшей форме документ имеет следующую структуру:mysql - ТЕОРИЯ, необходимая для проектирования таблицы

doc_id (Primary Key) 
name 
doc_type 
doc_category 

Существует два типа doc_types, link или blob. Если это blob, у него будет свой собственный набор doc_category, и если это ссылка, у него будет другой набор категорий.

Например

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

Что является лучшим способом таблицы отношений настройки? Для обеспечения правильности привязки правильных значений doc_category, это нужно сделать в логике business/php или я могу сделать это в mysql? Если да, то как? Есть лучший способ сделать это?

И наконец, для причин рабочего процесса как blob, так и ссылка должны иметь общий doc_id, поэтому разделение их на отдельную таблицу с собственным первичным ключом не будет работать. Любые советы по этому поводу очень ценятся.

+0

Ну, это будет работать, если все идентификаторы в одной таблице, были даже и в другой таблице нечетные – Strawberry

+0

Спасибо за комментарий но, к сожалению, это не сработает, так как добавится третий doc_type. –

+0

Итак, - просто мысль - возможно, ваш ПК действительно должен быть (doc_id, doc_type)? – Strawberry

ответ

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: 
+1

Liutas большое вам спасибо, я пытался выяснить самый чистый способ сделать это, и дерево категорий именно это. Моя первоначальная мысль заключалась в том, чтобы иметь отдельную таблицу отношений для каждой категории с соответствующим идентификатором doc, но мой страх был опирался на php-логику, которая могла бы ввести ошибки, например doc_id, принадлежащие таблице 2 категории. То, что вы предложили, имеет смысл и гарантирует, что у doc_id есть одна уникальная категория, и вам снова будет фантастическая благодарность! –