0

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

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

用户 A 有以下数据:

  • 姓名
  • 电子邮件

用户 B 有以下数据:

  • 姓名
  • 电子邮件
  • 电话

用户 C 拥有以下数据:

  • 姓名
  • 电子邮件
  • 电话
  • 关于

用户 D 有以下数据:

  • 姓名
  • 电子邮件
  • 电话
  • 关于
  • 地址

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

4

5 回答 5

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
)

另一种建议的设计是创建两个表,一个用于用户,另一个用于类型。这里的主要优点是每当您有其他类型的用户时,您不必更改表,只需在用户类型表上添加额外的记录,然后用户表将引用该记录。

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)
)
于 2012-11-06T00:08:33.987 回答
2

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

您的示例在简单的继承层次结构中建议每个用户类型一个且只有一个附加字段。这真的是数据的样子,还是只是为了举例?如果这是您要求的真实表示,我可能会(为了方便起见)使用单个表。但如果真正的要求更复杂,我会硬着头皮“正确”地做。

于 2012-11-06T03:52:05.653 回答
1

尝试创建四个表:

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

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

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
于 2012-11-06T03:35:26.640 回答
0

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

于 2012-11-06T00:08:24.337 回答
0

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

于 2012-11-06T00:10:33.630 回答