[英]MySQL 2 foreign keys in 1tbl referencing 1 primary key
我的数据库中有2个表,但我不能完全正确定义关系:
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
可以通过引用tbl_admins在数据库上轻松实施第二个外键。 仅用户的外键必须在应用程序代码上强制执行。
这可以通过再创建两个表来解决:
***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布尔值表示tbl_user中的一个特定用户实际上是处理订单的admin(对于admin = 1)。 对于admin = 0,用户ID表示创建订单的用户。
希望这可以帮助。
另一种可能性:
将“组合用户”表命名为“人”,其中包含有关任何用户/管理员/其他任何用户类型的信息。
**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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.