将表中的单个列映射到两个不同表中的两个不同列

时间:2015-06-18 05:32:52

标签: mysql foreign-keys multiple-columns

我有两张桌子 品牌和商店

品牌可以在多家商店出售 商店可以销售多个品牌。

我有一个桥牌brand_store。

有一个名为StoreGroup的父存储表。

此商店组将包含属于父母的所有商店。 例如:KFC的所有商店都将映射到store_group表中的单个父级。

现在我必须创建一个User表,用户可以在其中扮演多个角色。

如果用户是管理员,那么他必须与storegrp绑定 如果用户是店主,那么他必须与特定商店联系在一起。

商家表看起来像"

商户

  

id

login_email_id

login_password

store_or_store_group_id

role_id

...

情景:

每个肯德基总部都可以指定一名管理员,一名店员等。

在商家表中,如果角色ID是admin,那么它应该绑定到store_group表中的KFC头,但如果角色ID是商店管理员,那么它应该绑定到商店表中的特定KFC商店。 / p>

我该如何处理这种情况。这是正确的做法吗?

3 个答案:

答案 0 :(得分:0)

如果您使用InnoDB,并且希望MySQL强制执行外键约束,则需要在merchant表中创建两个单独的列,而不是单列。

 , store_id       int  comment 'fk ref Store'
 , storegroup_id  int  comment 'fk ref StoreGroup'

 , CONSTRAINT FK_merchant_store FOREIGN KEY (store_id) REFERENCES Store(id)
 , CONSTRAINT FK_merchant_storegroup FOREIGN KEY (storegroup_id) REFERENCES StoreGroup(id)

没有声明性约束来防止填充两列,您希望数据库强制执行该操作,您需要创建BEFORE INSERT和BEFORE UPDATE触发器。

如果使用单个组合列,那么您将无法定义外键约束。您还需要一种方法来确定存储在该列中的值是对Store表还是StoreGroup表的引用(或者,{{1}的目的是什么}列?)

答案 1 :(得分:0)

我认为你很接近。您的商店表可以有外键" store_group_id"代替。 您只需将商店ID存储在商家表中即可。现在,您将能够根据role_id获取store_group_id(如果他是' admin'您可以使用商家表加入商店表以获取store_group_id)。我希望这有帮助

答案 2 :(得分:0)

我认为,你应该创建不同的表来将商家绑定到不同的模型。 '商家'是有关用户的常见信息。并且有一些(现在只有两个)不同的角色。这些角色定义了不同的行为如果现在数据库中的所有差异都存在于不同的绑定中,那么,稍后,角色可能会获得其他不同的属性。所以,在我看来,必须有这样的事情:

Merchant table:
  id, login_email_id, login_password, role_id 


AdminMerchant table:
  merchant_id - FK to merchant table, Unique
  store_group_id - FK to Store group table

ManagerMerchant table:
  merchant_id - FK to merchant table, Unique
  store_id - FK to store table