2011-09-03 64 views
0

我有我的DB 2个表,我不能完全正确定义的关系:2 MySQL的外键在1tbl引用1主键

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

  2. tbl_orders *持有一些信息关于用户创建的订单,并参考tbl_users,查看哪个用户创建了哪个订单。此外,此表应该对执行订单处理的管理员提供参考。在管理信息存储在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

另一种可能性:

名称“组合的用户”表中的“人”,持有任何用户/管理员/不管,其他-用户类型的信息了。

**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) 
+0

非常感谢你们,伙计们! :)我会试一试! :) – omot

0

第二个外键可以是eas通过引用tbl_admins在数据库上执行。只有用户的外键才能在应用程序代码上执行。

+0

或者你可以应用触发器来检查user_id是否真的是一个用户。 –

+0

我没有tbl_admins了。如果我决定在应用程序代码上强制执行FK,它会是什么样子?一般的伪代码是这样的? “如果tbl_users.ID = 7且tbl_users.admin = 1,则从tbl_users中选择名称,其中ID = 7”? – omot

+0

事情是,拥有处理订单的admin_ID记录会很棒。如果我只做了一个选择---,那么我没有记录,如果没有管理员处理和清除订单。 – omot

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 

大公可能看起来是一样的,但事实并非如此。第一个保存哪些用户创建哪个订单的数据,以及管理员通过订单的第二个数据。

或者,您可以在两个表汇总以上到一个表,说是这样的:

***tbl_user_order *** 
user_id --> foreign key: tbl_users.id 
order_id --> foreign key: tbl_orders.id 
admin boolean 

在上表中,管理员布尔说,从tbl_user一个特定的用户实际上是在其处理的管理该命令(对于admin = 1)。对于admin = 0,用户标识表示创建订单的用户。

希望这会有所帮助。