数据库设计。三元关系是唯一的出路吗?

Database design. Is trinary relationship the only way?

我有以下数据库模式:

表:

员工(id_pk,姓名)

employees_attend_at_service_desk(employee_id_pk_fk, service_desk_id_pk_fk not null) references employee and service_desk

service_desk(id_pk, name, shop_id_fk not null) references shop

works(employee_id_pk_fk,shop_id_pk_fk not null) references shop and employee

商店(id_pk, company_id_fk 不为空)

公司(id_pk,姓名)

将从网站和桌面应用程序查询此数据库。

所以考虑这个例子:商店 1 有 service_desk 1 和 2,商店 2 有 service_desk 3。雇员 1 只在商店 1 工作。

我想将商店 1 中的 service_desk 归因于员工 1,但我想添加某种限制,不允许我添加 service_desk 3,例如因为该服务desk 属于 shop 2 而 employee 1 只在 shop 1 工作。在考虑数据库设计时,三元关系是否是获得我所需要的唯一方法?

我想做的是查询数据库以获取商店 1 的所有员工,然后再次查询数据库以找出商店的 service_desk。 然后我可以将商店 1 的员工分配到相应的 service_desks.

这样做意味着数据库不是很健壮?或者这样的设计好吗?我的应用程序可以处理我需要的约束吗?

非常感谢大家!

一个选项是:

  1. shop_id_pk_fk 添加到 employees_attend_at_service_desk
  2. 添加外键 employees_attend_at_service_desk (shop_id_fk) 引用 shop (id_pk_)
  3. service_desk (id_pk, shop_id_fk 中创建唯一键。 (第 4 步需要)。
  4. 将外键添加到 employees_attend_at_service_desk (service_desk_id_pk_fk, shop_id_fk) 引用 service_desk (id_pk, shop_id_fk) 以确保为服务台输入有效的商店。
  5. 添加外键 employees_attend_at_service_desk (employee_id_pk_fk, shop_id_fk) 引用 works (employee_id_pk_fk, shop_id_pk_fk)

这将复制一些数据,但只有一个 int 列,这意味着您可以构建必要的约束以确保服务台上有一名有效员工。

您也可以将验证留给您的应用程序。我认为这两种方式都不是特别糟糕的做法。