gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 15:42:08 24 4
gpt4 key购买 nike

我有一个用户表,想要为 externalRequester 和 externalReviewer 维护一个标志。但每 1000 个用户中只有 80 到 100 个用户是外部请求者或审阅者。这是在用户表中添加列以维护标志的正确方法吗?剩下的空值怎么办?请提出任何解决方案。

最佳答案

这要看情况。您要添加多少个此类标志?你会用它们做什么?

除非您有很多这些标志列,否则空间不太可能成为问题。用于简单的是/否标志的 tinyintenum对于多种选择,每行也只有 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;

这可能看起来有些过分,但如果您需要仅向审阅者用户添加更多信息,它会很有用。您可以向reviewers而不是users添加列,这样可以避免浪费大量空间。例如,您可能希望通过添加 reviewers.created_at 来存储用户成为审阅者的时间。

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

这也有助于提高引用完整性。例如,评论只能由评论者用户进行。通过标志,评论引用用户并且它可以潜在地引用任何用户。这会导致错误和额外的复杂性,以保持数据完整性。

通过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
);

关于mysql - MySQL表中添加额外列的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57505762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com