Проектирование базы данных - модель отношений сущностей - PullRequest
0 голосов
/ 29 июля 2011

У меня есть следующая проблема, которую мне нужно выразить.

Есть люди, рабочие места и сайты. Каждому человеку может быть назначено несколько рабочих мест. Каждое рабочее место может иметь несколько человек. Каждое рабочее место имеет ровно один сайт. Все идет нормально. Но моя проблема в том, что у каждого человека есть только одно рабочее место на конкретном сайте.

Как я могу выразить это в ERM?

Моя идея пока:

idea

Я просто не могу выразить, что «у одного человека есть только одно рабочее место на конкретном сайте» - проблема с этим подходом.

Реализация решения:

Table Person with Prs_ID (PK)
Table Site with Site_ID (PK)
Table Workplace with Plc_ID (PK)
Table Person_Site with Prs_Site_PrsID (PK, FK), Prs_Site_SiteID (PK, FK), Prs_Site_PlcID (FK)
Unique Index on Prs_Site_PlcID

Я думаю, что это должно решить проблему. Теперь, как я могу выразить это в ERM?

Edit:

Я думал, что это решит проблему, но это не так. При этом я не могу назначить одно рабочее место двум разным людям, потому что в столбце Prs_Site_PlcID есть уникальный индекс. Вернуться к началу ...

Ответы [ 3 ]

2 голосов
/ 29 июля 2011

enter image description here

Примечание: уникальный индекс Ak1 (альтернативный ключ) (SiteID, WorkplaceID) на Workplace, который распространяется на PersonWorkplace.

--
-- PostgreSQL
--
create table Site      (SiteId      integer not null);
create table Person    (PersonId    integer not null);
create table Workplace (WorkplaceID integer not null, SiteID integer not null);
create table PersonWorkplace
(PersonID integer not null, SiteID integer not null, WorkplaceID integer not null);

alter table Site   add constraint pk_Sit primary key (SiteID);
alter table Person add constraint pk_Prs primary key (PersonID);

alter table Workplace
  add constraint  pk_Wpl primary key (WorkplaceID)
, add constraint fk1_Wpl foreign key (SiteId) references Site (SiteId)
, add constraint ak1_Wpl unique (SiteID, WorkplaceID);

alter table PersonWorkplace
  add constraint  pk_PrsWpl primary key (PersonId, SiteID)
, add constraint fk1_PrsWpl foreign key (PersonId) references Person (PersonID)
, add constraint fk2_PrsWpl foreign key (SiteID, WorkplaceID) references Workplace (SiteID, WorkplaceID);
1 голос
/ 29 июля 2011

Я думаю, что ключ в вопросе.

Вы говорите, что у каждого рабочего места есть один сайт - отношения, таким образом:

у многих людей много рабочих мест

Одно рабочее место имеет один сайт;

Предложение по реализации:

Person table
-----------
person_id primary key
.....

Workplace table
--------------
workplace_id primary_key
site_id (unique index)

person_workplace table
-------------------
person_id
workplace_id

site table
--------------
site_id primary key

Уникальный индекс столбца site_id в таблице рабочих мест гарантирует, что каждыйрабочее место связано с другим сайтом.

0 голосов
/ 29 июля 2011

Вам нужны промежуточные столы СОТРУДНИКОВ, которые представляют СРОКИ ПЕРСОНА на рабочем месте, работающем на работодателя. Один человек может быть много работников, то есть работать на более чем одного работодателя. Дневная работа / ночная работа или работа подряд. СОТРУДНИК не является синонимом юридического лица, но является представителем лица на работодателя.

...