Mysql SQL,是否分隔列?

Mysql SQL,是否分隔列?,mysql,sql,database-design,Mysql,Sql,Database Design,我有一张桌子: 用户 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) 这将使检索数据变得非常容易。但也许更好的方法是将代码放

我有一张桌子:

用户

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)

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

这取决于所有酷用户的酷用户代码是否相同。如果是一样的,你一定要把它放在另一张桌子上。如果不是,那没什么大不了的,两种解决方案都应该可以,但我会把它放在第一个表中,因为没有理由不这样做。

这取决于所有酷用户的酷用户代码是否相同。如果是一样的,你一定要把它放在另一张桌子上。如果不是,那也没什么大不了的,两种解决方案都应该可以,但我会把它放在第一个表中,因为没有理由不这样做。

这是一个模糊的问题,取决于您将如何使用数据。实际上,虽然您有一个表作为确定,这是用户表

由于并非所有用户都需要“cool_user_code”,因此最好将其作为一个单独的表,主键为“user_id”,它与users表的关系为1:1

但这当然取决于其他因素。您可以在Users表中增加一个额外的“additional_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)
);

(视情况将“VARCHAR”、“BLOB”或“INT”等替换为“TEXT”)

这是一个模糊的问题,取决于您将如何使用数据。实际上,虽然您有一个表作为确定,这是用户表

由于并非所有用户都需要“cool_user_code”,因此最好将其作为一个单独的表,主键为“user_id”,它与users表的关系为1:1

但这当然取决于其他因素。您可以在Users表中增加一个额外的“additional_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)
);

(将“VARCHAR”、“BLOB”或“INT”等替换为“TEXT”,视情况而定)

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

  • 每个层次结构的表
  • 每个非抽象类的表
  • 每班一张桌子

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

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

  • 每个层次结构的表
  • 每个非抽象类的表
  • 每班一张桌子

  • 在您的例子中,由于继承层次结构非常简单,并且子级中只有一个附加字段,因此我建议使用第一种方法(即将所有内容放在一个表中,使附加字段可以为NULL)。您甚至可以删除
    user\u-type
    ,只需根据附加字段是否为空来识别用户类型(假设您以后不添加更多用户类型)。

    酷用户\u-code包含什么?假设酷用户是某种VIP,每个VIP都可以有自己的代码,类似于“1XKL82M”
    cool\u user\u code
    包含什么?假设cool\u user是一种VIP,每个VIP都可以有自己的代码,类似于“1XKL82M”的荣誉,Simon。你一针见血。+1这里最重要的一点涉及到该列为
    NULL
    的频率。根据(模糊的)描述,似乎用户修改器最好作为自己的表。这还取决于是否希望使用它作为选择的手段。对于获得所有“酷炫用户”而言,向该表进行内部连接可能是一种比在大量行膨胀的情况下尝试从枚举列中选择要高效得多的方法。。。你特别是抄袭了我说的话,换言之:P。我知道这取决于情况,但总体上哪一个更好?就像在大多数情况下你会遇到的那样?一般来说没有更好的,或者两者都一样好。我个人会选择2表方法,但1表方法有它的用途。如果不知道更多关于数据如何填写的信息,不知道如何使用额外数据等,就不可能给出更具体的建议。这就像走进一家酒吧说“我想喝一杯”一样,西蒙。你一针见血。+1这里最重要的一点涉及到该列为
    NULL
    的频率。根据(模糊的)描述,似乎用户修改器最好作为自己的表。这还取决于是否希望使用它作为选择的手段。对该表进行内部连接可能是获得所有“酷用户”的更有效的方法