数据库付费用户和试用用户在同一个表中

时间:2010-11-19 00:40:26

标签: database

如果您必须使用付费用户和试用用户设计数据库,您是否会将它们放在同一个表中并使用字段区分它们?或者你会把它们放在两个单独的表中?

或者你会在两个世界中做得最好并将它们放在同一张桌子中但创建两个视图1)PaidUsers和2)TrialUsers

谢谢!

3 个答案:

答案 0 :(得分:1)

我只是在以下意见中表达了一些性能考虑因素。

在单用户查询中(例如登录检查或单个用户的数据检索),这两种策略之间没有显着差异。

但是,如果您需要一些统计数据,例如,一个用于付费用户,另一个用于试用用户。分成两张桌子可能是一个好主意。

否则,如果您需要某些付费用户或试用用户的统计数据,单表可能是个好主意。


如果您需要这两种方案怎么办?好吧,我认为这是两种用户之间存在一些共同属性的情况。

这些公共属性应放在一个表中,特定用户的专用属性应放在继承自前表的“子表”中。正如vonPetrushev所说。

答案 1 :(得分:0)

最佳解决方案可能取决于数据库类型。我的经验是MySQL和SQL Server。我总是将所有用户放在一个表中。然后根据需要使用字段进行区分。这可能适用于付费/未付款或其他任何内容。该解决方案符合3NF标准,对我来说似乎更容易进行维护等。使用多个表的原因是什么?

答案 2 :(得分:0)

由于您的付费用户可能与某些其他数据相关,但仍然具有与非付费相同的字段集,因此正确的方法是[is-a]方法:

用户
id
用户名
密码
全名
...

付费用户
user_id [fk->User::id]
account_id
.... [其他附加数据]

编辑:现在,试用用户将是User中没有Paiduser条目的所有记录。我假设Paiduser fieldset是试用版/普通用户[User]的字段集的超集。

编辑2 :要获取UserPaiduser之间“设置差异”的试用用户列表,以下sql应该有效:

select u.*
from (User as u
      join Paiduser as p on u.id<>p.user_id)