Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Экземпляр сущности может быть экземпляром одной из двух других но не обоих сразу / 11 сообщений из 11, страница 1 из 1
10.11.2009, 14:46
    #36301226
En_t_end
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экземпляр сущности может быть экземпляром одной из двух других но не обоих сразу
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
CREATE TABLE docs1(
attr1 integer,
attr2 text,
PRIMARY KEY(attr1)
);
CREATE TABLE docs2(
attr1 text,
attr3 text,
PRIMARY KEY(attr1)
);
CREATE TABLE documents(
id integer,
PRIMARY KEY(id)
);
CREATE TABLE documents_docs1(
id integer,
attr1 integer,
FOREIGN KEY(id) REFERENCE TO documents(id),
FOREIGN KEY(attr1) REFERENCE TO docs1(attr1),
PRIMARY KEY(id,attr1)
);
CREATE TABLE documents_docs2(
id integer,
attr1 text,
FOREIGN KEY(id) REFERENCE TO documents(id),
FOREIGN KEY(attr1) REFERENCE TO docs2(attr1),
PRIMARY KEY(id,attr1)
);
Суть в следующем. Один документ может быть либо документом из docs1 либо из docs2, но не может быть сразу из обоих. В приведенной выше схеме это важное условие нарушается. Так получилось, что изменять структуру docs1 и docs2 я не могу, но мне нужно создать сущность(documents), объединяющую разнородные docs1 и docs2.
Спасибо.
...
Рейтинг: 0 / 0
10.11.2009, 15:01
    #36301282
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экземпляр сущности может быть экземпляром одной из двух других но не обоих сразу
En_t_end,

а зачем последние 2 таблицы?
...
Рейтинг: 0 / 0
10.11.2009, 15:04
    #36301291
Esu
Esu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экземпляр сущности может быть экземпляром одной из двух других но не обоих сразу
да ничего тут уже толком не сделаешь...
разве что какой-то view
в котором
select 1 as id_doc_type, * from docs1
union all
select 2 as id_doc_type, * from docs2

PK у него тогда композитный получится
id_doc_type+id таблицы docs1 или docs2
...
Рейтинг: 0 / 0
10.11.2009, 15:13
    #36301322
En_t_end
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экземпляр сущности может быть экземпляром одной из двух других но не обоих сразу
Naf,
Попытка связать documents с docs1, docs2. В дальнейшем предполагается ссылаться в других таблицах именно на documents(id)
...
Рейтинг: 0 / 0
10.11.2009, 15:20
    #36301338
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экземпляр сущности может быть экземпляром одной из двух других но не обоих сразу
почему так получилось, что не можешь менять структуру?
С уважением, Naf
...
Рейтинг: 0 / 0
10.11.2009, 15:32
    #36301369
En_t_end
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экземпляр сущности может быть экземпляром одной из двух других но не обоих сразу
Naf,
Я работаю над плагином для Trac(SVN+Wiki+IssueTracker), там есть таблица wiki такой структуры:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE wiki(
    name text,
    version integer,
    time integer,
    author text,
    ipnr text,
    text text,
    comment text,
    readonly integer,
    PRIMARY KEY(name,version)
);
это docs2 в обозначениях этой темы, её я точно не могу изменять.
...
Рейтинг: 0 / 0
10.11.2009, 15:54
    #36301450
aston
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экземпляр сущности может быть экземпляром одной из двух других но не обоих сразу
Триггеры в вашей СУБД имеются?
...
Рейтинг: 0 / 0
10.11.2009, 15:57
    #36301468
aston
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экземпляр сущности может быть экземпляром одной из двух других но не обоих сразу
Или CHECK CONSTRAINTS ?
...
Рейтинг: 0 / 0
10.11.2009, 16:17
    #36301568
En_t_end
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экземпляр сущности может быть экземпляром одной из двух других но не обоих сразу
astonИли CHECK CONSTRAINTS ?
Да, это sqlite версии 3.6.20.
...
Рейтинг: 0 / 0
10.11.2009, 16:25
    #36301616
aston
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экземпляр сущности может быть экземпляром одной из двух других но не обоих сразу
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TABLE documents(
    id      integer     NOT NULL,
    attr1   integer     NULL,
    attr2   text        NULL,
    ...
FOREIGN KEY(attr1) REFERENCE TO docs1(attr1),
FOREIGN KEY(attr2) REFERENCE TO docs2(attr1),
PRIMARY KEY(id)
);
/

ALTER TABLE documents 
    ADD CONSTRAINT check_docs_refs (
        (attr1 IS NOT NULL AND attr2 IS NULL) 
            OR 
        (attr1 IS NULL AND attr2 IS NOT NULL)
);
/
...
Рейтинг: 0 / 0
12.11.2009, 12:53
    #36306492
En_t_end
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экземпляр сущности может быть экземпляром одной из двух других но не обоих сразу
aston,
Спасибо, ваш вариант удачен
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Экземпляр сущности может быть экземпляром одной из двух других но не обоих сразу / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]