powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Связывание таблиц различных объектов с одной
25 сообщений из 74, страница 1 из 3
Связывание таблиц различных объектов с одной
    #34848328
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется несколько разных таблиц для разных объектов (например, Люди, Дома, Города) и таблица со ссылками на фотографии этих объектов. Если бы объекты были однородными (например, только Люди), я бы сделал классическую схему "многие-ко-многим". А сливать такие разные объекты не хочется, т.к. не хочется валить в одну кучу совершенно разные атрибуты. Пожалуйста, подскажите что-н. толковое.
...
Рейтинг: 0 / 0
Связывание таблиц различных объектов с одной
    #34848416
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
|-------|-> Люди
|Объект |-> Дома
|-------|-> Города
    |
    V
|-------|
| фото  |
|-------|
...
Рейтинг: 0 / 0
Связывание таблиц различных объектов с одной
    #34848531
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
например, как описано здесь .
...
Рейтинг: 0 / 0
Связывание таблиц различных объектов с одной
    #34867103
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я правильно понимаю?
...
Рейтинг: 0 / 0
Связывание таблиц различных объектов с одной
    #34868052
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неправильно.
...
Рейтинг: 0 / 0
Связывание таблиц различных объектов с одной
    #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
Связывание таблиц различных объектов с одной
    #34868403
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас проснется guest_ или выйдет из камотоза и прочтет лекцию о не знании основ ;-)
...
Рейтинг: 0 / 0
Связывание таблиц различных объектов с одной
    #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
Связывание таблиц различных объектов с одной
    #34873444
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я, пожалуй, не буду дожидаться guest'а:
2 Bely
Объясните, пожалуйста, как Вы собираетесь поддерживать ссылочную целостность в предложенной Вами схеме?
...
Рейтинг: 0 / 0
Связывание таблиц различных объектов с одной
    #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
Связывание таблиц различных объектов с одной
    #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
Связывание таблиц различных объектов с одной
    #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
Связывание таблиц различных объектов с одной
    #34874693
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вместо Name короче и суше ObjectTypeId- FK на таблицу ObjectType (ObjectTypeId,TableName)
...
Рейтинг: 0 / 0
Связывание таблиц различных объектов с одной
    #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
Связывание таблиц различных объектов с одной
    #34875997
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelR 2 4321 автор2. либо добавлением константного поля во все таблицы (и в их первичные ключи, на лидирующей позиции, ес-нно). не понял, зачем в ПК всех таблиц.по большому - незачем

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

+1
Нужна объединяющая разнородные понятия сущность - "объект"
...
Рейтинг: 0 / 0
Связывание таблиц различных объектов с одной
    #34878416
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bely любая комбинация с ним будет уникальнаматематический факт. Однако SQL серверы этого не знают:( . Оне соглашаются принять FK только на явно объявленный UNIQUE / PK .
...
Рейтинг: 0 / 0
Связывание таблиц различных объектов с одной
    #34878454
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelR Bely любая комбинация с ним будет уникальнаматематический факт. Однако SQL серверы этого не знают:( . Оне соглашаются принять FK только на явно объявленный UNIQUE / PK .понятно
...
Рейтинг: 0 / 0
Связывание таблиц различных объектов с одной
    #34879099
Фотография 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
Связывание таблиц различных объектов с одной
    #34879122
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRВ какой-то момент пользователь системы решил, что Города - не тот тип, который можно представить (одним) Фото, а Люди - как раз тот тип, что может быть Товаром... Придется переделывать ограничения целостности...Тут надо решить что именно и как легко может менять пользователь.

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

Поэтому если типы будут меняться часто - то констрэйнты будут только мешать.
Но у автора топика - ситуация, скорее, обратная.
...
Рейтинг: 0 / 0
Связывание таблиц различных объектов с одной
    #34879158
Фотография 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
Связывание таблиц различных объектов с одной
    #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]