在MySQL表中添加额外列的解决方案

时间:2019-08-15 06:44:49

标签: mysql

我有一个用户表,并希望为externalRequester和externalReviewer保留一个标志。但是每1000个用户中只有80到100个用户是外部请求者或审阅者。 是在用户表中添加列以维护标志的正确方法吗? 剩下的空值呢? 请提出解决方案。

1 个答案:

答案 0 :(得分:0)

这取决于。您将要添加多少种此类标志?而您将如何处理他们?

除非您有很多 这些标记列,否则

空间不太可能成为问题。每个简单的是/否标志的tinyint或几个选择的enum每行也只有1或2个字节。

如果有很多这样的标志(is_revieweris_adminis_user)维护所有索引及其组合的索引,可能会很麻烦,并且会占用更多的磁盘空间


另一种方法是为每种类型使用单独的表。当表示事物的特殊类型时,这特别有用。

create table reviewers (
    id serial primary key,
    user_id bigint not null,
    foreign key (user_id) references users(id)
        on delete cascade
);

然后用left join找到您的评论者。

select users.*
from reviewers
left join users on users.id = reviewers.id;

这似乎有些矫kill过正,但是如果您只需要向审阅者添加更多信息,它就很有用。您可以将列添加到reviewers中,而不要添加到users中,这样可以避免浪费大量空间。例如,您可能想通过添加reviewers.created_at来存储用户成为审阅者的时间。

它还整齐地处理索引。 MySQL在查询中为每个表使用一个索引,因此始终在索引上搜索作为审阅者的用户。

这也有助于参考完整性。例如,reviews仅应由审阅者使用。 reviews带有标志,引用users,并且可能引用任何user。这会导致错误和额外的复杂性,以保持数据完整性。

通过reviewers表,reviews引用reviewers来保证完整性。

create table reviews (
    id serial primary key,
    reviewer_id bigint not null,
    foreign key (reviewer_id) references reviewers(id)
        on delete cascade,
    review text not null,
    stars tinyint not null
);