Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Связывание таблиц различных объектов с одной / 25 сообщений из 74, страница 1 из 3
05.10.2007, 06:31
    #34848328
КД
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
Имеется несколько разных таблиц для разных объектов (например, Люди, Дома, Города) и таблица со ссылками на фотографии этих объектов. Если бы объекты были однородными (например, только Люди), я бы сделал классическую схему "многие-ко-многим". А сливать такие разные объекты не хочется, т.к. не хочется валить в одну кучу совершенно разные атрибуты. Пожалуйста, подскажите что-н. толковое.
...
Рейтинг: 0 / 0
05.10.2007, 08:30
    #34848416
pkarklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
|-------|-> Люди
|Объект |-> Дома
|-------|-> Города
    |
    V
|-------|
| фото  |
|-------|
...
Рейтинг: 0 / 0
05.10.2007, 09:38
    #34848531
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
например, как описано здесь .
...
Рейтинг: 0 / 0
14.10.2007, 06:12
    #34867103
КД
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
Я правильно понимаю?
...
Рейтинг: 0 / 0
15.10.2007, 10:27
    #34868052
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
Неправильно.
...
Рейтинг: 0 / 0
15.10.2007, 10:31
    #34868071
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
Можно, конечно, и так - но есть способ (куда) лучше.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE TABLE    obj
(
OBJ_ID INTEGER   primary key,
NAME  varchar2( 200 )
)


CREATE TABLE    house
(
OBJ_ID INTEGER   primary key, (FK на OBJ.OBJ_ID)
....
)
CREATE TABLE    people
(
OBJ_ID INTEGER   primary key, (FK на OBJ.OBJ_ID)
....
)
-- итд

...
Рейтинг: 0 / 0
15.10.2007, 11:53
    #34868403
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
Сейчас проснется guest_ или выйдет из камотоза и прочтет лекцию о не знании основ ;-)
...
Рейтинг: 0 / 0
16.10.2007, 15:50
    #34872068
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
2 Bely
Код: plaintext
1.
2.
insert into  obj     (OBJ_ID ,NAME) values ( 1 ,"Он");
insert into  house (OBJ_ID,...)       values ( 1 ,...);
insert into  people (OBJ_ID,...)      values ( 1 ,...);
Кто же "Он" на самом деле - house или человек?
...
Рейтинг: 0 / 0
17.10.2007, 06:07
    #34873444
КД
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
Я, пожалуй, не буду дожидаться guest'а:
2 Bely
Объясните, пожалуйста, как Вы собираетесь поддерживать ссылочную целостность в предложенной Вами схеме?
...
Рейтинг: 0 / 0
17.10.2007, 09:54
    #34873708
-----------------
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
ModelR2 Bely
Код: plaintext
1.
2.
insert into  obj     (OBJ_ID ,NAME) values ( 1 ,"Он");
insert into  house (OBJ_ID,...)       values ( 1 ,...);
insert into  people (OBJ_ID,...)      values ( 1 ,...);
Кто же "Он" на самом деле - house или человек?

В быту - headershoulder
В ООП - множественное наследование
...
Рейтинг: 0 / 0
17.10.2007, 10:20
    #34873806
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
ModelR2 Bely
Код: plaintext
1.
2.
insert into  obj     (OBJ_ID ,NAME) values ( 1 ,"Он");
insert into  house (OBJ_ID,...)       values ( 1 ,...);
insert into  people (OBJ_ID,...)      values ( 1 ,...);
Кто же "Он" на самом деле - house или человек?Иван Федорович Крузенштерн. Человек и Корабль. (с) Печкин

Знаете способ лучше? Поделитесь...

КДОбъясните, пожалуйста, как Вы собираетесь поддерживать ссылочную целостность в предложенной Вами схеме?так
Код: 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.
CREATE TABLE anketa_head
    (ank_id                         NUMBER NOT NULL,
    ank_type_id                    NUMBER,
    ankh_city_id                   NUMBER)
/

ALTER TABLE anketa_head
ADD CONSTRAINT pk_ank_head PRIMARY KEY (ank_id)
USING INDEX
/

CREATE TABLE anketa_auto
    (ank_id                         NUMBER NOT NULL,
    lift_num                       NUMBER,
    test_bench_num                 NUMBER,
    paint_room_num                 NUMBER)
/

ALTER TABLE anketa_auto
ADD CONSTRAINT pk_ank_auto PRIMARY KEY (ank_id)
USING INDEX
/
-- Foreign Key
ALTER TABLE anketa_auto
ADD CONSTRAINT fk_anketa_auto_ank_id FOREIGN KEY (ank_id)
REFERENCES anketa_head (ank_id)
/
...
Рейтинг: 0 / 0
17.10.2007, 11:07
    #34874049
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
ModelR2 Bely
Код: plaintext
1.
2.
insert into  obj     (OBJ_ID ,NAME) values ( 1 ,"Он");
insert into  house (OBJ_ID,...)       values ( 1 ,...);
insert into  people (OBJ_ID,...)      values ( 1 ,...);
Кто же "Он" на самом деле - house или человек?это лечицо:
ALTER TABLE object CREATE CONSTRAINT check_tblnames CHECK "name" IN ('house','people',...)
и добавлением скажем триггерной проверки к ФК табличек (то,что существует именно строка с таким именем и значением id).

с другой это лечится еще и:
1. либо разделением неперекрывающихся диапазонов для house.id people.id ... (несколько способов, в т.ч. - (триггерное) пользование общего счетчика), или прорежением счетчика ~~ DEFAULT nextval('...')* основание + остаток сравнения (+ такой же чек на каждую таблу).
2. либо добавлением константного поля во все таблицы (и в их первичные ключи, на лидирующей позиции, ес-нно). (что несколько раздует все данные и индексы), но проще при уже заполненной базе, где разделение диапазонов id не обеспечивалось.
...
Рейтинг: 0 / 0
17.10.2007, 13:04
    #34874693
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
Вместо Name короче и суше ObjectTypeId- FK на таблицу ObjectType (ObjectTypeId,TableName)
...
Рейтинг: 0 / 0
17.10.2007, 14:54
    #34875216
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
BelyПоделитесь...?
Код: 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.
29.
30.
31.
32.
33.
34.
CREATE TABLE anketa_head
    (ank_id                         NUMBER NOT NULL,
    ank_type_id                    NUMBER,
    ankh_city_id                   NUMBER)
/

ALTER TABLE anketa_head
ADD CONSTRAINT pk_ank_head PRIMARY KEY (ank_id)
USING INDEX
/
ALTER TABLE anketa_head
ADD CONSTRAINT uq1_ank_head UNIQUE (ank_id, ank_type_id )
USING INDEX
/

CREATE TABLE anketa_auto(  
    ank_id        NUMBER NOT NULL,
    ank_type_id   NUMBER DEFAULT  101  CHECK (ank_type =  101  ),
    lift_num         NUMBER,
    test_bench_num   NUMBER,
    paint_room_num   NUMBER
    )
/


ALTER TABLE anketa_auto
ADD CONSTRAINT pk_ank_auto PRIMARY KEY (ank_id)
USING INDEX
/
-- Foreign Key
ALTER TABLE anketa_auto
ADD CONSTRAINT fk_uq1_ank_head FOREIGN KEY (ank_id, ank_type_id)
REFERENCES anketa_head (ank_id, ank_type_id)
/
2 4321 автор2. либо добавлением константного поля во все таблицы (и в их первичные ключи, на лидирующей позиции, ес-нно). не понял, зачем в ПК всех таблиц.
2 SeVa
Если уж сушить, то пары ObjectType (ObjectTypeId,TableName) вполне можно добывать из словаря СУБД - если придерживаться определенного соглашения об именах объектов словаря.
...
Рейтинг: 0 / 0
17.10.2007, 17:42
    #34875997
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
ModelR 2 4321 автор2. либо добавлением константного поля во все таблицы (и в их первичные ключи, на лидирующей позиции, ес-нно). не понял, зачем в ПК всех таблиц.по большому - незачем

, ибо, вообще говоря достаточно повесить индекс на пару (тип, ид) (для оптимайза джойнов, а то оптимайзер может не прочухать), но т.к. индекс по ключу и так создается - всунуть в ключ и тип - сэкономить на индексах. (хотя вру, скорее всего ид-ки пипплов и тп. будут еще где-нито провязаны в 1-много без константных типов, т.ч. уникью на ид-ник придется вешать отдельно... видимо да, в ключ - незачем. просто создать индексы (тип, ид))
...
Рейтинг: 0 / 0
17.10.2007, 19:28
    #34876297
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
ModelR...Ну это практически одно и то же.
И самое главное - не то, что собирался делать автор.

Автору, наверно, подойдет больше Ваш вариант.

PS: это лишнее :)
Код: plaintext
1.
2.
3.
4.
ALTER TABLE anketa_head
ADD CONSTRAINT uq1_ank_head UNIQUE (ank_id, ank_type_id )
USING INDEX
/
...
Рейтинг: 0 / 0
18.10.2007, 11:31
    #34877304
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
BelyPS: это лишнее :)дык без него как

ALTER TABLE anketa_auto
ADD CONSTRAINT fk_uq1_ank_head FOREIGN KEY (ank_id, ank_type_id)
REFERENCES anketa_head ( ank_id, ank_type_id )

за што собственно и боролися.
...
Рейтинг: 0 / 0
18.10.2007, 13:18
    #34877779
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
ModelR BelyPS: это лишнее :)дык без него как

ALTER TABLE anketa_auto
ADD CONSTRAINT fk_uq1_ank_head FOREIGN KEY (ank_id, ank_type_id)
REFERENCES anketa_head ( ank_id, ank_type_id )

за што собственно и боролися.Уникальность ank_id - гарантирует primary key.
Соответственно - любая комбинация с ним будет уникальна, либо просто не вставится :)
...
Рейтинг: 0 / 0
18.10.2007, 13:42
    #34877892
DelphiMen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
pkarklin
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
|-------|-> Люди
|Объект |-> Дома
|-------|-> Города
    |
    V
|-------|
| фото  |
|-------|

+1
Нужна объединяющая разнородные понятия сущность - "объект"
...
Рейтинг: 0 / 0
18.10.2007, 15:45
    #34878416
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
Bely любая комбинация с ним будет уникальнаматематический факт. Однако SQL серверы этого не знают:( . Оне соглашаются принять FK только на явно объявленный UNIQUE / PK .
...
Рейтинг: 0 / 0
18.10.2007, 16:01
    #34878454
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
ModelR Bely любая комбинация с ним будет уникальнаматематический факт. Однако SQL серверы этого не знают:( . Оне соглашаются принять FK только на явно объявленный UNIQUE / PK .понятно
...
Рейтинг: 0 / 0
18.10.2007, 18:57
    #34879099
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
ModelR
Код: plaintext
1.
2.
3.
...
    ank_type_id   NUMBER DEFAULT  101  CHECK (ank_type =  101  ),
...

В обсуждаемой схеме прослеживаются два "вида" таблиц:
один - это "домашние таблички типов" (Люди, Дома, Города, Авто)
второй - таблички "интерфейсов" (Фото, пусть еще для примера - Товар)
Допустим, все четыре "типа" поддерживают "интерфейс" Фото, и только Дома и Авто поддерживают Товар, т.е. в "интерфейсных" таблицах будут ограничения типа:

... type_id ... CHECK (type_id in(Люди, Дома, Города, Авто) ) - для Фото
... type_id ... CHECK (type_id in(Дома, Авто) ) - для Товара

В какой-то момент пользователь системы решил, что Города - не тот тип, который можно представить (одним) Фото, а Люди - как раз тот тип, что может быть Товаром... Придется переделывать ограничения целостности...

Понятно, что для табличек-"типов" такая ситуация маловероятна. А вот для табличек-"интерфейсов" такая схема ссылочной целостности выглядит слишком "жесткой", imho.
...
Рейтинг: 0 / 0
18.10.2007, 19:11
    #34879122
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
LRВ какой-то момент пользователь системы решил, что Города - не тот тип, который можно представить (одним) Фото, а Люди - как раз тот тип, что может быть Товаром... Придется переделывать ограничения целостности...Тут надо решить что именно и как легко может менять пользователь.

Можно привести другие примеры - Хочется ввести не просто человека, а разделить на "Сотрудника", "Клиента" итд.
Для э
того придется вводить новый тип и... переделать ограничения целостности.

Поэтому если типы будут меняться часто - то констрэйнты будут только мешать.
Но у автора топика - ситуация, скорее, обратная.
...
Рейтинг: 0 / 0
18.10.2007, 19:32
    #34879158
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
Размышления над менее "жестким" вариантом ссылочной целостности привели к такой примерно схеме (не пинайте, оракл(?) в глаза не видел):
Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
/* "Мета"-слой */
CREATE TABLE anketa_head_meta(
    ank_type_id                   NUMBER NOT NULL,
    ... )
/
ALTER TABLE anketa_head_meta
ADD CONSTRAINT pk_ank_head_meta PRIMARY KEY (ank_type_id)
USING INDEX
/
CREATE TABLE anketa_auto_meta(  
    ank_type_id        NUMBER NOT NULL,
    ... )
/
ALTER TABLE anketa_auto_meta
ADD CONSTRAINT pk_ank_auto_meta PRIMARY KEY (ank_type_id)
USING INDEX
/
ALTER TABLE anketa_auto_meta
ADD CONSTRAINT fk_uq1_ank_head_meta FOREIGN KEY (ank_type_id)
REFERENCES anketa_head_meta (ank_type_id)
/


/* "Объектный"-слой */
CREATE TABLE anketa_head
    (ank_id                         NUMBER NOT NULL,
    ank_type_id                    NUMBER,
    ankh_city_id                   NUMBER)
/
ALTER TABLE anketa_head
ADD CONSTRAINT pk_ank_head PRIMARY KEY (ank_id)
USING INDEX
/
ALTER TABLE anketa_head
ADD CONSTRAINT fk_uq1_ank_head FOREIGN KEY (ank_type_id)
REFERENCES anketa_head_meta (ank_type_id)
/
CREATE TABLE anketa_auto(  
    ank_id        NUMBER NOT NULL,
    ank_type_id   NUMBER,
    lift_num         NUMBER,
    test_bench_num   NUMBER,
    paint_room_num   NUMBER
    )
/
ALTER TABLE anketa_auto
ADD CONSTRAINT pk_ank_auto PRIMARY KEY (ank_id)
USING INDEX
/
ALTER TABLE anketa_auto
ADD CONSTRAINT fk_uq1_ank_auto FOREIGN KEY (ank_id)
REFERENCES anketa_head (ank_id)
/
ALTER TABLE anketa_auto
ADD CONSTRAINT fk_ank_auto_type FOREIGN KEY (ank_type_id)
REFERENCES anketa_auto_meta (ank_type_id)
/

Т.е., грубо говоря, добавить еще один мета-слой (топологически, таблично напоминающий "объектный"), тогда, добавляя/удаляя записи в таблицы_meta, мы сможем регулировать(не изменяя структуру/код) ограничения целостности...
...
Рейтинг: 0 / 0
19.10.2007, 12:11
    #34880434
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблиц различных объектов с одной
Нет предела совершеству. Кроме ограничения сочетаний "интерфейсов" (или я бы лучше сказал "ролей" - все же это не программные интерфейсы) с типами можно потребовать ограничить сочетаемость ролей между собой. А когда вдруг роли и типы начнут плодиться как кролики -построить иерархию типов и классификацию ролей т.д.

Для плоской системы типов и ролей еще можно применить тот же фокус с константными полями.
псевдокод для краткости
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
TABLE type (type_id) PK (type_id);

TABLE object (obj_id, type_id) PK (obj_id) UNIQUE (obj_id, type_id) 
  FK ((type_id) REF type (type_id)) ;
TABLE type<x> (obj_id, type_id CONST(x)) PK (obj_id) 
  FK ((obj_id, type_id) REF object (obj_id, type_id));

TABLE role (role_id) PK (role_id);
TABLE role_type (role_id,type_id) PK (role_id,type_id) 
  FK ((type_id) REF type (type_id))  FK ((role_id) REF role (role_id));

TABLE role<y> (obj_id, type_id, role_id CONST(y)) PK (obj_id) 
  FK ((obj_id, type_id) REF object (obj_id, type_id)) 
  FK ((type_id, role_id) REF role_type (role_id,type_id));

ну а дальше - дешевле сделать кодом промежуточного слоя ИМХО.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Связывание таблиц различных объектов с одной / 25 сообщений из 74, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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