我有下表:
users:
- id
- name
- user_type_id (references id on user_types)
neighborhoods:
- id
- name
homes:
- id
- house_number
- neighborhood_id (references id on neighborhoods)
user_types:
- id
- label
可用的 user_types 是resident , neighborhood_admin , super_admin。每种类型的用户都可以访问系统的不同部分。只有居民必须与homes
表有关系。
我在考虑添加一个数据透视表,例如:
residents:
- user_id (references id on users)
- home_id (references id on home)
但我不确定这种方法是否正确。我仅将数据透视表用于多对多关系。此外,使用代码我必须在分配房屋之前检查 user_type,但如果我不小心的话,我可以很容易地将房屋分配给 super_admin。
我怎样才能让数据库强制执行这个限制,这样它就不必通过代码来完成了?
更新:我忘了补充,neighbourhood_admins 必须分配给一个社区。我可以添加下表:
neighborhood_admins:
- user_id (references id on users)
- neighborhood_id (references id on neighborhoods)
但这会产生一个问题。该users
表现在与表有两种不同的关系neighborhoods
;如果用户是 neighborhood_admin,那么关系是从数据透视表中获得的,neighborhood_admin
但如果用户是居民,那么我们必须首先获得home
关系,然后是家庭的邻居。
我在想我还不如在表中添加一neighborhood_id
列users
并完成它,但我不喜欢那些关系三角形。此外,该列对于 super_admins 将为空,因此它不可能是外键。
在大多数 RDBMS 中,您都可以设置列条件,这对这种情况很有用。假设您的用户类型是 1、2 和 3(分别是 res、admin 和 super)。你可以
users
这样设置: