2011-03-12 36 views
3

我创建一个新的数据库,我有这个问题:我有两种类型的用户可以下订单:注册用户(即,他们有一个登录)和来宾用户(即没有登录)。注册用户和访客用户的数据是不同的,这就是为什么我想使用两个不同的表,但订单(共享相同的工作流)都是一样的,所以我想只使用一个表。我读过herehere(即使我不完全理解这个例子),我可以强制执行mysql规则,在表中有相互排斥的列(在我的情况下,他们会是“idGuest”和“idUser”)但我不喜欢这种方法。mysql数据库的设计,以避免有一个表互斥字段

有没有更好的方法来做到这一点?

感谢您的帮助

回答

1

听起来大多关系父/子问题。我已经回答了a similar question,并包含了您应该能够适应而不会有太多麻烦的示例代码。 (确保你阅读了评论。)

对你来说,温和复杂的因素是一个子类型(访客用户)可能有一天会成为不同的子类型(注册用户)。你如何处理这将取决于应用程序。 (意思是你知道,但可能没人会。)

+0

链接的问题很有意思,谢谢。 – 2011-03-12 15:02:49

1

我想我会有三个表:

  • 一个user表中,将包含: 为每个用户
    • 一行,无论用户是什么类型
    • 这两个客人和注册的数据
    • 一个字段,指示行是否对应于一个reg istered或客人
  • 一个guest表中,将包含: 每位客人用户
    • 一行,
    • 的数据表明,特定于客人
  • 而一个registered表,这将包含:
    • 每注册用户一行,
    • 特定于re的数据gistered用户

然后,参照用户(在你orders表为例)时,你总是使用user表的ID。

2

有几种方法,这取决于记录的数量和唯一字段的数量。例如,如果你说他们只有两个字段不同,我会建议你把所有内容放在同一个表中。
我的方法假设它们有很大的不同,可能会认为“对象”:
您有一个主用户表,并且对于每种用户类型,您都有另外一张“详细说明”用户信息的表。

Users 
----- 

id,email,phone,user_type(guest or registered) 

reg_users 
--------- 

users_id, username,password etc..... 

unreg_users 
----------- 

user_id,last_known_address, favorite_color....etc 

其中USER_ID是外键users

0

Orders表中的外键指向放置订单的Customer实体通常是一个不可为空的列。如果您有两个不同的客户表(RegisteredCustomer和GuestCustomer),那么您需要在Orders表中指定两个单独的可空的列,指向单独的客户表。我建议只有一个Customers表,只包含注册用户和访客用户通用的那些行(编辑:对不起,只想写这些列),然后是具有外键关系的RegisteredUsers表与客户表。

0

你所描述的是一个多态表。这听起来很可怕,但它确实不是那么糟糕。

您可以保留单独的用户和来宾表。对于您的订单表,您有两列:foreign_idforeign_type(您可以将它们命名为任何内容)。该foreign_id是在你的情况下,用户或客户的ID和foreign_type的内容将是要么userguest

id | foreign_id | foreign_type | other_data 
------------------------------------------------- 
1 | 1   | user   | ... 
2 | 1   | guest   | ... 

要为特定用户或客人选择行,只需指定foreign_type以及ID:

SELECT * FROM orders WHERE foreign_id = 1 AND foreign_type = 'guest'; 
相关问题