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

时间:2011-09-03 16:01:25

标签: mysql sql foreign-keys

我的数据库中有两个表,我无法正确定义关系:

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

  2. 对属性进行排序
  3. tbl_orders *包含有关用户创建的订单的一些信息,以及对tbl_users的引用,以查看哪个用户创建了哪个订单。此外,此表应包含对执行订单处理的admin的引用。管理员信息存储在tbl_users。*

  4. 表格说明:

    **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
    

3 个答案:

答案 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)