数据库设计。三元关系是唯一的出路吗?
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.
这样做意味着数据库不是很健壮?或者这样的设计好吗?我的应用程序可以处理我需要的约束吗?
非常感谢大家!
一个选项是:
- 将
shop_id_pk_fk
添加到 employees_attend_at_service_desk
- 添加外键
employees_attend_at_service_desk (shop_id_fk)
引用 shop (id_pk_)
- 在
service_desk (id_pk, shop_id_fk
中创建唯一键。 (第 4 步需要)。
- 将外键添加到
employees_attend_at_service_desk (service_desk_id_pk_fk, shop_id_fk)
引用 service_desk (id_pk, shop_id_fk)
以确保为服务台输入有效的商店。
- 添加外键
employees_attend_at_service_desk (employee_id_pk_fk, shop_id_fk)
引用 works (employee_id_pk_fk, shop_id_pk_fk)
这将复制一些数据,但只有一个 int 列,这意味着您可以构建必要的约束以确保服务台上有一名有效员工。
您也可以将验证留给您的应用程序。我认为这两种方式都不是特别糟糕的做法。
我有以下数据库模式:
表:
员工(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.
这样做意味着数据库不是很健壮?或者这样的设计好吗?我的应用程序可以处理我需要的约束吗?
非常感谢大家!
一个选项是:
- 将
shop_id_pk_fk
添加到employees_attend_at_service_desk
- 添加外键
employees_attend_at_service_desk (shop_id_fk)
引用shop (id_pk_)
- 在
service_desk (id_pk, shop_id_fk
中创建唯一键。 (第 4 步需要)。 - 将外键添加到
employees_attend_at_service_desk (service_desk_id_pk_fk, shop_id_fk)
引用service_desk (id_pk, shop_id_fk)
以确保为服务台输入有效的商店。 - 添加外键
employees_attend_at_service_desk (employee_id_pk_fk, shop_id_fk)
引用works (employee_id_pk_fk, shop_id_pk_fk)
这将复制一些数据,但只有一个 int 列,这意味着您可以构建必要的约束以确保服务台上有一名有效员工。
您也可以将验证留给您的应用程序。我认为这两种方式都不是特别糟糕的做法。