powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FK с одного поля на две табли
20 сообщений из 20, страница 1 из 1
FK с одного поля на две табли
    #39465629
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По ходу проектирования базы пришел к выводу, что проще работников и больных хранить в разных таблях
работнички
Код: sql
1.
2.
3.
CREATE TABLE TBL_STAFF (
    ID                    INTEGER NOT NULL
...)


больные
Код: sql
1.
2.
3.
CREATE TABLE TBL_PEOPLE (
    ID                    INTEGER NOT NULL
...)


, а генератор использовать для обеих табличек один.
например
Код: sql
1.
CREATE GENERATOR GEN_TBL_PEOPLE_ID;


И, чтобы не создавать два разных поля с FK в третьей таблице
Код: sql
1.
2.
3.
4.
CREATE TABLE TBL_ADDRESS (
    ID                    INTEGER NOT NULL,
    FK_PEOPLE             INTEGER NOT NULL 
...)


подумалось, а нельзя ли создать 2 FK на одно поле
Код: sql
1.
2.
ALTER TABLE TBL_ADDRESS ADD CONSTRAINT FK_TBL_ADDRESS_1 FOREIGN KEY (FK_PEOPLE) REFERENCES TBL_PEOPLE (ID) ON UPDATE CASCADE;
ALTER TABLE TBL_ADDRESS ADD CONSTRAINT FK_TBL_ADDRESS_2 FOREIGN KEY (FK_PEOPLE) REFERENCES TBL_STAFF (ID) ON UPDATE CASCADE;



Есть какие-то неприятные неожиданности в будущем в этом случае?
=================
Док.

Win7 Ultim x64/Deb 8.7 i386:
FB 3.0.2.32703, диалект 3, SS(win)/SC(Deb),
Lazarus 1.9(r.55042); FPC 3.1.1 (r.36290), IBX by -Rik-; IBE 2017.4.19.2
...
Рейтинг: 0 / 0
FK с одного поля на две табли
    #39465681
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокЕсть какие-то неприятные неожиданности в будущем в этом случае?
Пробовал вставлять? Один из FK при этом будет нерабочим (на другую таблицу).
...
Рейтинг: 0 / 0
FK с одного поля на две табли
    #39465691
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanПробовал вставлять?
решил сначала спросить :) т.е. одно поле - один ФК, железное правило?
...
Рейтинг: 0 / 0
FK с одного поля на две табли
    #39465695
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докт.е. одно поле - один ФК, железное правило?
Такого правила не знаю.
ФК это ссылочная целостность и ты пытаешься вставить значение, которое указывает на одну из двух таблиц .
То есть один из двух ФК взбунтуется, сказав, что в его таблице такого значения нет.
...
Рейтинг: 0 / 0
FK с одного поля на две табли
    #39465696
Док,

ты для начала попробуй объявить два внешних ключа с одного поля одной таблицы на две другое. если сможешь - приходи спрашивать, будет ли оно работать.... Большинство СУБД тебя пошлют ещё на этапе попытки создать второй FK. Оставшиеся - пошлют в момент попытки вставить запись в твою чудо-таблицу...
...
Рейтинг: 0 / 0
FK с одного поля на две табли
    #39465701
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - ЭхБольшинство СУБД тебя пошлют ещё на этапе попытки создать второй FK.
уже был послан
Но решил, это потому, что в табле уже есть несколько записей.

Ну, на нет и суда нет. Спасибо за разъяснения.
...
Рейтинг: 0 / 0
FK с одного поля на две табли
    #39465728
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

Выход - два поля FK_PEOPLE и FK_STAFF, каждое из которых ссылается на свою таблицу.
Добавляешь вычисляемое поле ID_TRUE_PEOPLE или заранее рассчитывай его через триггер:
ID_TRUE_PEOPLE = IIF(NEW.ID_PEOPLE IS NOT NULL, NEW.ID_PEOPLE, NEW.ID_STAFF);
...
Рейтинг: 0 / 0
FK с одного поля на две табли
    #39465730
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMaxID_TRUE_PEOPLE = IIF(NEW.ID_PEOPLE IS NOT NULL, NEW.ID_PEOPLE, NEW.ID_STAFF);
Тогда уж coalesce.
...
Рейтинг: 0 / 0
FK с одного поля на две табли
    #39465733
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Да.
...
Рейтинг: 0 / 0
FK с одного поля на две табли
    #39465741
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman, CyberMax

спасибо, конечно, но нафиг :)

Сделал в табле TBL_PEOPLE поле IsStaff для маркировки работников, которые тоже могут быть больными. А в запросе решил джойнится к TBL_PEOPLE 2 раза под разными алиасами.
...
Рейтинг: 0 / 0
FK с одного поля на две табли
    #39465824
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
05.06.2017 1:00, Док пишет:
> По ходу проектирования базы пришел к выводу, что проще работников и больных хранить в разных таблях

неправильно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FK с одного поля на две табли
    #39465924
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

у нас таблицы:

объект идентификации. егойный ПК - тот самый ид.

на него ссылаются сотрудники, клиенты, организации.

у каждого ПК и ФК на объект в одном флаконе.
...
Рейтинг: 0 / 0
FK с одного поля на две табли
    #39466194
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastorу каждого ПК и ФК на объект в одном флаконе
Я примерно понял о чем речь, но сам еще до таких высот не эволюционировал :)

А можно простейшую схему привести?
...
Рейтинг: 0 / 0
FK с одного поля на две табли
    #39466220
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докpastorу каждого ПК и ФК на объект в одном флаконе
Я примерно понял о чем речь, но сам еще до таких высот не эволюционировал :)

А можно простейшую схему привести?

Код: sql
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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
create domain PK bigint not null;
create domain FK bigint;
create domain COMMENT varchar(100);
create domain  CURRENCY numeric(15,3);
create table ACCOUNTS ( -- счета
ID PK,
COMMENT COMMENT,
constraint ACCOUNTS
primary key (ID)
);
create table TRANSACTIONS( -- транзакции по счетам
ID PK,
ID_ACC FK,
SUMM  CURRENCY,
constraint TRANSACTIONS
primary key (ID),
constraint TRANSACTIONS_ACC
foreign key (ID_ACC)
references ACCOUNTS(ID)
);
create table PEOPLES(
ID PK,
FNAME COMMENT,
MNAME COMMENT,
LNAME COMMENT,
FULL_NAME computed by (LNAME || ' ' || FNAME || ' ' || MNAME),
constraint PEOPLES
primary key (ID),
constraint PEOPLES_ACC
foreign key (ID)
references ACCOUNTS(ID)
on delete CASCADE
);
create table ORGANIZATIONS(
ID PK,
NAME COMMENT,
CAPTION COMMENT,
constraint ORGANIZATIONS
primary key (ID),
constraint ORGANIZATIONS_ACC
foreign key (ID)
references ACCOUNTS(ID)
on delete CASCADE
);

-- все транзакции
select ID_ACC, sum(SUMM), count(*)
from TRANSACTIONS
group by 1

-- человеков
select t.ID_ACC, p.FULL_NAME, sum(t.SUMM), count(*)
from TRANSACTIONS t
join PEOPLES p on p.ID = t.ID_ACC
group by 1, 2


-- сборищ
select t.ID_ACC, o.NAME, sum(t.SUMM), count(*)
from TRANSACTIONS t
join ORGANIZATIONS o on o.ID = t.ID_ACC
group by 1, 2


-- опять все
select t.ID_ACC, p.FULL_NAME, sum(t.SUMM), count(*)
from TRANSACTIONS t
join PEOPLES p on p.ID = t.ID_ACC
group by 1, 2
union all
select t.ID_ACC, o.NAME, sum(t.SUMM), count(*)
from TRANSACTIONS t
join ORGANIZATIONS o on o.ID = t.ID_ACC
group by 1, 2

...
Рейтинг: 0 / 0
FK с одного поля на две табли
    #39466289
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastor,

спасибо
...
Рейтинг: 0 / 0
FK с одного поля на две табли
    #39467360
mvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

у нас так сделано: общая таблица Люди (к ней цепляются адреса, документы и проч.), и функциональные таблицы Студенты и Сотрудники, которые ссылаются на Людей. Никаких проблем с ФК.
...
Рейтинг: 0 / 0
FK с одного поля на две табли
    #39467444
mvb,

так у тебя студенты и сотрудники цепляются на людей, а ТС хотел, чтобы люди цеплялись на сотрудников и студентов. Что называется "почувствуй разницу" (с)
...
Рейтинг: 0 / 0
FK с одного поля на две табли
    #39467511
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mvbу нас так сделано
я уж понял, что иногда стоит заводить суррогатные таблицы, чтобы впихнуть невпихуемое :)

Спасибо, вопрос исчерпан
...
Рейтинг: 0 / 0
FK с одного поля на две табли
    #39467764
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
07.06.2017 4:34, Добрый Э - Эх пишет:
> так у тебя студенты и сотрудники цепляются на людей,
> а ТС хотел, чтобы люди цеплялись на сотрудников и студентов.
> Что называется "почувствуй разницу" (с)

а патаму шо!
Док нифига не проводил декомпозицию задачи, с формализацией сЦущностей.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FK с одного поля на две табли
    #39467768
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МимопроходящийДок нифига не проводил декомпозицию задачи, с формализацией сЦущностей.
По сценарию тут должен объявиться Док и отписаться "звиняйте, я не погромист".
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FK с одного поля на две табли
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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