SQL,是否将列分开?

时间:2013-06-10 22:19:00

标签: 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)

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

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

逻辑上,你有一个父“class”(普通用户)和一个从它继承的子“class”(很酷的用户)。在物理上,有三种方法可以在关系数据库中实现继承:

  1. 每个层次结构的表格。
  2. 每个非抽象类的表。
  3. 每班一桌。
  4. 在您的情况下,由于继承层次结构非常简单,并且您在子项中只有一个额外的字段,我建议使用第一种方法(即将所有内容放在一个表中,使额外字段为NULL)。您甚至可以删除user_type并根据额外字段是否为NULL来识别用户类型(假设您之后不再添加更多用户类型)。

答案 2 :(得分:-1)

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