Структура данных

Profic

just Profic (PHP5 BetaTeam)
Структура данных

Мну совсем голову сломал :( Помогите плз со структурой таблиц и/или запросами

Имеется пачка документов, которые могут иметь следующие реквизиты:
- Текст документа (1)
- Название (1)
- Тип (1)
- Орган (0+)
- Номер (0+)
- Дата (0+)
- Категория (1+)
- Доп информация (0-1)
Цифры в скобках обозначают следующее:
1 - атрибут обязятельный и имеет только одно значение
1+ - атрибут обязятельный, но может иметь не одно значение
0+ - атрибут необязятельный, но может иметь не одно значение
0-1 - атрибут необязятельный, но если присутствует, имеет только одно значение
По большому счету все это - частные случаи 0+
Причем, если в документе имеется несколько органов, то они должны иметь привязку к нескольким датам и нескольким номерам, если они есть. Например, номер у документа один, но имеется 3 органа и 3 даты для каждого органа. То же самое и с номерами, т.е. одна дата, но несколько органов и несколько номеров для каждого органа. Не исключен вариант и с несколькими органами с соответствующими номерами и датами для каждого.
Плюс, в процессе эксплуатации могут обявляться еще какие-нибудь атрибуты.
Вот сижу и голову ломаю, как организовать структуру данных, да и запросы, тоже не лезут в голову.

Пока придумал только такое (там не все атрибуты, а только самые необходимые):
[sql]
# таблица с содержимым документа
CREATE TABLE docs2 (
doc_id int(10) unsigned NOT NULL auto_increment,
doc_content mediumtext NOT NULL,
PRIMARY KEY (doc_id)
);

INSERT INTO docs2 VALUES (1, 'doc1');
INSERT INTO docs2 VALUES (2, 'doc2');

# таблица с описаниями полей
CREATE TABLE docs2_fields (
field_id int(10) unsigned NOT NULL auto_increment,
field_name varchar(100) NOT NULL,
field_type varchar(25) NOT NULL,
PRIMARY KEY (field_id)
);

INSERT INTO docs2_fields VALUES (1, 'Название', 'strval');
INSERT INTO docs2_fields VALUES (2, 'Орган', 'intval');
INSERT INTO docs2_fields VALUES (3, 'Тип', 'intval');
INSERT INTO docs2_fields VALUES (4, 'Дата', 'dateval');
INSERT INTO docs2_fields VALUES (5, 'Номер', 'strval');

# таблица с данными на поля
CREATE TABLE docs2_field_data (
data_id int(10) ubsigned NOT NULL
field_id int(10) unsigned NOT NULL,
doc_id int(10) unsigned NOT NULL,
strvar text,
intval int(11),
dateval date,
PRIMARY KEY (data_id)
);

INSERT INTO docs2_field_data VALUES (1, 1, 1, 'О лабуде', NULL, NULL);
INSERT INTO docs2_field_data VALUES (2, 2, 1, NULL, 21, NULL);
INSERT INTO docs2_field_data VALUES (3, 3, 1, NULL, 31, NULL);
INSERT INTO docs2_field_data VALUES (4, 4, 1, NULL, NULL, '2002-01-01');
INSERT INTO docs2_field_data VALUES (5, 5, 1, '51', NULL, NULL);
INSERT INTO docs2_field_data VALUES (6, 1, 2, 'О лаже', NULL, NULL);
INSERT INTO docs2_field_data VALUES (7, 2, 2, NULL, 22, NULL);
INSERT INTO docs2_field_data VALUES (8, 3, 2, NULL, 32, NULL);
[/sql]
Все было бы (наверное) нормально, если бы не фигня с соответствиями органов, номеров и дат. Куда их тут прилепить не могу придумать…

Да и еще: есть ли возможность так организовать данные, чтобы за один запрос можно было выдрать из базы нужные значения одного документа в одном поле. Т.е. провернуть, что-то типа такого запроса:
[sql]
SELECT docs2_fields.field_name, @a:=docs2_fields.field_type, docs2_field_data.@a FROM docs2_field_data LEFT JOIN docs2_fields USING (field_id) WHERE doc_id = 1
[/sql]
который, естественно, не работает? Или я многого хочу и
1) нужно выдирать данные n+1 запросами, т.е. запрашивать все типы
[sql]
SELECT DISTINCT field_type FROM docs2_fields;
[/sql]
и для каждого типа запускать
[sql]
SELECT docs2_fields.field_name, docs2_field_data.$field_type FROM docs2_field_data LEFT JOIN docs2_fields USING (field_id) WHERE doc_id = 1
[/sql]
или
2) все одним запросом
[sql]
SELECT * FROM docs2_field_data LEFT JOIN docs2_fields USING (field_id) WHERE doc_id = 1
[/sql]
и смотреть на поле field_type и соответственно брать значение из соответствующего поля?

ЗЫ. Может я вообще пошел не по тому пути? И есть более прямой способ? :)
В общем help needed просто жутко :)
 

Falc

Новичок
Profic
Очень тяжело разбираться в структуре в виде "CREATE TABLE"
Попробуй все нарисовать на бумаге или в визио. Тогда и тебе будет виднее и другим будет проще понять твою структуру.
 

Profic

just Profic (PHP5 BetaTeam)
Да неимением визио "нарисовал" в аксессе
http://mi.kursknet.ru/data_struct.gif
только легче от этого не стало :(
И отобразить связь между содержимым поля и его значением тоже не получилось
 

Falc

Новичок
Я понял тебя ты не хочешь хранить каждый реквизит в своей табличке.
Такое решение будет удобным в том случае если эти реквизиты будут меняться в будующем (под такие изменения не предеться переделывать базу.)

Но с другой стороны будут проблемы если тебе надо будет каждый реквизит как-то по свойму обрабалывать.


И потом реквизиты типа (1) а бы оставил в табличке docs
 

Profic

just Profic (PHP5 BetaTeam)
мне в общем все-равно, т.к. поля, если и будут добавляться, то крайне редко и это вообще маловероятно
Меня в данном случае больше интересует, как запихать в базу все связи. Т.е. просто запихать в базу органы, даты и номера без связок низя, т.к. отображать нужно будет именно в связянном виде...
 

Falc

Новичок
То есть дата и номер у тебя относится к органу а не к документу?
Если так то органы надо выносить в отдельную таблицу.
 

Profic

just Profic (PHP5 BetaTeam)
прочитай первый пост
Причем, если в документе имеется несколько органов, то они должны иметь привязку к нескольким датам и нескольким номерам, если они есть. Например, номер у документа один, но имеется 3 органа и 3 даты для каждого органа. То же самое и с номерами, т.е. одна дата, но несколько органов и несколько номеров для каждого органа. Не исключен вариант и с несколькими органами с соответствующими номерами и датами для каждого.
В том и фигня, что могут относиться, только к документу, а могут И к документу И к органу
 

Falc

Новичок
Тебе надо разделить даты.
Одни будут у документов другие у органов (органы в отделной таблице)
 

Profic

just Profic (PHP5 BetaTeam)
Ничего не понял, а как тогда те, которые у органов относиться к документам?
 

Falc

Новичок
Profic
>>а как тогда те, которые у органов относиться к документам?

Писать одни и теже дуту и номер в обе таблицы.
 
Сверху