如何构建我的用户数据库?

时间:2012-11-06 00:03:15

标签: mysql sql database

我有一个允许用户使用不同类型的网站。每种类型都可以做特定的事情。我问我是否应该为所有用户设置1个表并将类型存储在枚举中,或者我应该为每种类型制作不同的表。现在,如果唯一不同的是类型,我很容易只选择一个表。但是,这是一个场景。

4个用户是A,B,C,D。

用户A的数据为:

  • 名称
  • 电子邮件

用户B的数据为:

  • 名称
  • 电子邮件
  • 电话

用户C的数据为:

  • 名称
  • 电子邮件
  • 电话

用户D的数据为:

  • 名称
  • 电子邮件
  • 电话
  • 地址

如果我要创建一个表,我应该为不同的用户留下不同的字段吗?或者我应该为每个用户创建一个完整的单独表?

5 个答案:

答案 0 :(得分:2)

如果你能为所有人创建一个表,那就好多了。虽然有些文件是可以为空的。并为每种类型的用户添加一个额外的列( enum )。如果保留当前的设计,则必须使用一些加入联盟作为记录。 (在服务器上增加了额外的开销

CREATE TABLE users
(
    ID INT,
    name VARCHAR(50),
    email VARCHAR(50),
    phone VARCHAR(50),
    about VARCHAR(50),
    address VARCHAR(50),
    userType ENUM()         -- put types of user here
)

另一个建议的设计是创建两个表,一个用于用户,另一个用于类型。这里的主要优点是,无论何时有另一种类型的用户,您都不必更改表,而只需在用户类型表上添加额外的记录,然后由users表引用。

CREATE TABLE UserType
(
    ID INT PRIMARY KEY,
    name VARCHAR(50)
)

CREATE TABLE users
(
    ID INT,
    name VARCHAR(50),
    email VARCHAR(50),
    phone VARCHAR(50),
    about VARCHAR(50),
    address VARCHAR(50),
    TypeID INT,
    CONSTRAINT rf_fk FOREIGN KEY (TypeID) REFERENCES UserType(ID)
)

答案 1 :(得分:2)

基本数据库设计原则建议一个表用于公共元素和附加表,JOIN返回到基表,以获取每种类型用户唯一的属性。

您的示例建议在简单的继承层次结构中每个用户类型只有一个附加字段。是真的数据是什么样的,或者你只是为了这个例子?如果这是对您的要求的真实表示,我可能会(为方便起见)使用单个表。但如果真正的要求更复杂,我会咬紧牙关并“正确”地做到这一点。

答案 2 :(得分:1)

尝试创建四个表:

Table 1: Name, email
Table 2: Name, phone
Table 3: Name, about
Table 4: Name, address

名称是所有四个表的主键。数据库中没有空值。您不是存储枚举类型,而是从表连接中派生类型:

To find all User A select all records in table 1 not in table 2
To find all User B select all records in table 2 not in table 3
To find all User C select all records in table 3 not in table 4
To find all User D select all records in table 4

答案 3 :(得分:0)

您不应该为不同的人创建表,因为这会导致数据库膨胀。最好创建一个包含所需字段的单个表。如果您不使用该字段,请传入空值。

答案 4 :(得分:0)

我建议你使用一个带有可空字段的单个表。还有一个类似角色的表格。