我有一个用户表,并希望为externalRequester和externalReviewer保留一个标志。但是每1000个用户中只有80到100个用户是外部请求者或审阅者。 是在用户表中添加列以维护标志的正确方法吗? 剩下的空值呢? 请提出解决方案。
答案 0 :(得分:0)
这取决于。您将要添加多少种此类标志?而您将如何处理他们?
除非您有很多 这些标记列,否则空间不太可能成为问题。每个简单的是/否标志的tinyint
或几个选择的enum
每行也只有1或2个字节。
如果有很多这样的标志(is_reviewer
,is_admin
,is_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
);