0

我有一张桌子:

用户

id| login| user_type

----------

1 | John | normal_user
2 | Kate | cool_user
3 | Brian | cool_user

现在假设有一些代码可以分配给某种类型的用户(cool_user)。因此,作为一项规则:向现有表中添加一列是否更好,如下所示:

Users(id, login, user_type, cool_user_code)

这将使检索数据变得超级容易。但也许更好的方法是将代码放入单独的表中并建立一对一的关系?

Users(id, login, user_type)
Cool_User_codes(id, user_id, code)

哪种解决方案更好,为什么?

4

3 回答 3

3

这是一个模糊的问题,而是取决于您将如何使用数据。实际上,尽管您肯定有 1 个表,即用户表。

因为并非所有用户都需要“cool_user_code”,所以最好将其作为一个单独的表,该表具有主键“user_id”,它与 Users 表存在 1:1 的关系。

但这当然取决于其他因素。您可以改为在用户表中添加一个额外的“additional_user_code”列,以便稍后根据需要与其他类型一起使用。那么问题来了,如果将用户更改为不再“酷”,cool_user_code 会发生什么。

简而言之,您的问题太模糊,无法得到具体答案。

我将如何执行此操作的示例表

CREATE TABLE users(
    userID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    userLogin VARCHAR(255) NOT NULL,
    userType ENUM('normal_user','cool_user'),
    PRIMARY(userID)
);

CREATE TABLE userAdditionalData(
    userID INT UNSIGNED NOT NULL,
    userAdditionalData TEXT NOT NULL,
    PRIMARY(userID)
)

... 或者 ...

CREATE TABLE users(
    userID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    userLogin VARCHAR(255) NOT NULL,
    userType ENUM('normal_user','cool_user'),
    userAdditionalData TEXT DEFAULT NULL,
    PRIMARY(userID)
);

(酌情用“TEXT”代替“VARCHAR”、“BLOB”或“INT”等)

于 2013-06-10T22:23:37.823 回答
1

从逻辑上讲,您有一个父“类”(普通用户)和一个从它继承的子“类”(酷用户)。物理上,在关系数据库中实现继承有 3 种方式:

  1. 每个整个层次结构的表。
  2. 每个非抽象类的表。
  3. 每班表。

在您的情况下,由于继承层次结构非常简单,并且您在子项中只有一个附加字段,因此我推荐第一种方法(即将所有内容放在一个表中,使额外字段可以为 NULL)。您甚至可以删除user_type并仅根据额外字段是否为 NULL 来识别用户类型(假设您以后不添加更多用户类型)。

于 2013-06-10T23:07:24.073 回答
-1

这取决于所有cool_users 的cool_user_code 是否相同。如果相同,则绝对应该将其放在另一个表中。如果不是,那没什么大不了的,两种解决方案都应该没问题,但我会把它放在第一个表中,因为没有理由不这样做。

于 2013-06-10T22:23:23.917 回答