我的数据库中有两个表,我无法正确定义关系:
tbl_users 包含有关系统用户和管理员的一些信息(我“打包”了2个不同的表 - tbl_users和tbl_admins - 因为大约有90%的属性重叠。主要区别在于通过引入布尔数据类型的属性* *
tbl_orders *包含有关用户创建的订单的一些信息,以及对tbl_users的引用,以查看哪个用户创建了哪个订单。此外,此表应包含对执行订单处理的admin的引用。管理员信息存储在tbl_users。*
表格说明:
**tbl_users**
id int pk
name varchar
address varchar
**tbl_admins**
id int pk
name varchar
address varchar
这两个打包在一起的样子如下:
**tbl_users**
id int pk
name varchar
address varchar
user boolean
admin boolean
问题从这里开始:
**tbl_orders**
id int pk
amount int
processed boolean
user_id - references tbl_users, but only the user that is user boolean=1
admin_id - references tbl_users, but only the user that is admin boolean=1
答案 0 :(得分:0)
通过引用tbl_admins,可以在数据库上轻松实施第二个外键。只有用户的外键才能在应用程序代码上强制执行。
答案 1 :(得分:0)
这可以通过再创建两个表来解决:
***tbl_user_order ***
user_id --> foreign key: tbl_users.id
order_id --> foreign key: tbl_orders.id
*** tbl_admin_order ***
user_id --> foreign key: tbl_users.id
order_id --> foreign key: tbl_orders.id
Thay可能看起来一样,但事实并非如此。第一个保存用户创建哪个订单的数据,以及第二个管理员通过订单的数据。
或者,您可以将上面的两个表聚合到一个表中,如下所示:
***tbl_user_order ***
user_id --> foreign key: tbl_users.id
order_id --> foreign key: tbl_orders.id
admin boolean
在上表中,admin boolean表示来自tbl_user的一个特定用户实际上是处理订单的admin(对于admin = 1)。对于admin = 0,用户标识表示用户创建订单。
希望这有帮助。
答案 2 :(得分:0)
另一种可能性:
将“合并用户”表命名为“人员”,并保存有关任何user / admin / whatever-other-usertype的信息。
**tbl_persons**
id int pk
name varchar
address varchar
然后,让另一个表只存储一个人实际上是用户的信息(以及另一个用于管理员的表):
**tbl_users**
id int pk (NOT auto_incremented), fk references tbl_persons(id)
**tbl_admins**
id int pk (NOT auto_incremented), fk references tbl_persons(id)
然后,很容易定义外键约束并强制执行您描述的完整性:
**tbl_orders**
id int pk
amount int
processed boolean
user_id fk references tbl_users(id)
admin_id fk references tbl_admins(id)