繁体   English   中英

1tbl中的MySQL 2外键引用1个主键

[英]MySQL 2 foreign keys in 1tbl referencing 1 primary key

我的数据库中有2个表,但我不能完全正确定义关系:

  1. tbl_users包含一些有关系统用户和管理员的信息(我将2个不同的表“ tbl_users”和“ tbl_admins”“打包”在一起,因为属性重叠约90%。属性之间的主要区别是通过引入布尔数据类型的属性来排序的)*

  2. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM