Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FK с одного поля на две табли / 20 сообщений из 20, страница 1 из 1
05.06.2017, 01:00
    #39465629
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FK с одного поля на две табли
По ходу проектирования базы пришел к выводу, что проще работников и больных хранить в разных таблях
работнички
Код: 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
05.06.2017, 08:43
    #39465681
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FK с одного поля на две табли
ДокЕсть какие-то неприятные неожиданности в будущем в этом случае?
Пробовал вставлять? Один из FK при этом будет нерабочим (на другую таблицу).
...
Рейтинг: 0 / 0
05.06.2017, 09:05
    #39465691
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FK с одного поля на две табли
wadmanПробовал вставлять?
решил сначала спросить :) т.е. одно поле - один ФК, железное правило?
...
Рейтинг: 0 / 0
05.06.2017, 09:10
    #39465695
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FK с одного поля на две табли
Докт.е. одно поле - один ФК, железное правило?
Такого правила не знаю.
ФК это ссылочная целостность и ты пытаешься вставить значение, которое указывает на одну из двух таблиц .
То есть один из двух ФК взбунтуется, сказав, что в его таблице такого значения нет.
...
Рейтинг: 0 / 0
05.06.2017, 09:10
    #39465696
FK с одного поля на две табли
Док,

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

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

Выход - два поля 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
05.06.2017, 10:10
    #39465730
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FK с одного поля на две табли
CyberMaxID_TRUE_PEOPLE = IIF(NEW.ID_PEOPLE IS NOT NULL, NEW.ID_PEOPLE, NEW.ID_STAFF);
Тогда уж coalesce.
...
Рейтинг: 0 / 0
05.06.2017, 10:16
    #39465733
CyberMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FK с одного поля на две табли
wadman,

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

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

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

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

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

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

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

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

А можно простейшую схему привести?
...
Рейтинг: 0 / 0
05.06.2017, 21:19
    #39466220
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FK с одного поля на две табли
Док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
06.06.2017, 00:22
    #39466289
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FK с одного поля на две табли
pastor,

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

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

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

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

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


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