MySQL数据库设计,两种类型的记录 - 使用一个表还是两个单独的表?

时间:2011-04-06 22:04:12

标签: mysql sql database database-design

我正在构建一个具有两种不同类型用户的应用程序,我们可以调用一个 User_type_a ,另一个 User_type_b 。我想知道我是否应该在我的数据库中为两种类型的用户创建1个表,并且具有区分每个记录的用户类型的属性,或者是否应该为每种类型的用户创建两个单独的表。

考虑: 1. 99%的用户都是User_type_a 2. User_type_b除了User_type_a之外还需要属性(例如信用卡#等)

哪种设计方法最佳?或者这不重要。

5 个答案:

答案 0 :(得分:2)

一个用户表,假设用户类型b是真实用户。创建另一个链接到用户表的表,以存储用户类型B的CC详细信息。

这使您可以轻松地进行所有主要用户更改(搜索用户,更改用户详细信息,查找用户登录等),但不包含许多浪费的列。

请注意,如果您要存储信用卡号,那么您的数据中心和架构必须为PCI compliant,这是非常昂贵的。

答案 1 :(得分:2)

如果类型 B 只有通用用户类型的附加信息(列),则使用: enter image description here

如果类型 A B 有一些公共列和一组不同的列,请使用 enter image description here

我在两种情况下都保留User表中的所有公共列 - 子类型表只包含特定于每个列的列。请注意,UserID传播到子类型表。

答案 2 :(得分:1)

执行此操作的最佳方法是将所有用户存储在同一个表中,并使用与第二个表相关的外键,其中包含额外信息。

**USER TABLE**
NAME     AGE       TYPE     FK
Grant    25        Adult    1
Susan    4         Child    null
John     65        Adult    2

**EXTRA TABLE**
FK    CREDITCARD    OTHER
1     234234...     blah
2     2334...       blah

这对空间来说会更有效率。

答案 3 :(得分:1)

所以听起来User_type_a和User_type_b在数据方面都是相同的,但User_type_b除了User_type_a之外还有其他数据(但User_type_a没有像这样的任何唯一数据)。

鉴于此,我将创建一个存储User_type_a数据的单个用户表(即两种用户类型的交集)。然后为其他User_type_b数据创建第二个表,并使用外键将该链接返回给用户。 (请注意,users表中没有列定义哪些用户是哪种类型。)

如何区分两种用户类型?简单:User_type_b在第二个表中有一个相关的行; User_type_a没有。这使得任何不关心差异的应用程序功能都可以轻松地为每个人获取通用用户数据,而需要额外User_type_b数据的功能(或者只关心一种类型或另一种)仍然可以确定谁是什么类型,并获得额外的数据。

答案 4 :(得分:0)

使用一张桌子。他们都是用户。您的代码将在两种类型之间具有更多的一般用途,因此您可以避免在与用户打交道时进行2次SQL查询(即使它们在99%的时间内都不相关)