繁体   English   中英

如何更好地建立数据库

[英]How to better build a database

我们有一个 SQL 数据库,其中有一个用于用户的表 (1) 和一个用于用户保存信息的表 (2)。 每条信息在表(2)中占一行。 所以我的问题如下 - 如果我们打算将用户数量增加到超过 1.000.000 并且每个用户可以拥有超过 10 条信息,那么以下哪种方法是构建我们的数据库的更好方法:

a) 有 2 个表 - 1 个用于用户,1 个用于所有用户的信息,与具有 ID 的用户相关

b) 每个用户都有一个单独的表。

提前致谢。

绝对应该为用户提供一个单一的表要好得多。 从数据库的角度考虑。 您正在考虑排序 ID 的 1.000.000 行中的搜索时间。 在第二种情况下,您必须搜索 1.000.000 表才能进入正确的表。 所以最好选择选项A

我同意选项 A 是所提供的两个选项中更好的一个。

话虽如此,我个人也会将用户的信息分解成更多的表。 这一切都将使用外键连接,并允许对信息进行更具体的查询。

SQL 并不是真正的水平可扩展性,因此如果最终用户的信息比其他人少或多,那么您将拥有 NULL 列,这需要以各种方式处理。

通过使用单独的表格,您仍然可以包含所有信息,但不必担心如果一个用户有家庭电话号码和手机号码,而另一个用户只有手机号码。

如果您确实需要一次访问大量信息,SQL 非常擅长通过联接等来处理此问题。

选项 B 还不错,只是不适合 SQL。 如果有问题的数据库是基于文档而不是表格,我会工作。 在这种情况下,为每个用户创建一个文档是一个好主意,并且可能是首选。

选项 C) 表,用于具有唯一 UserID 作为聚集索引(主键)的用户表,用于具有唯一 InformationID 作为聚集索引(主键)的已保存信息类型表,用于具有唯一 UserInformationID 作为聚集索引(主键)的 UserInformation 表,列UserID(非聚集索引,用户表的外键)和 InformationID 列(非聚集索引,Information 表的外键)。 有一个“值”或类似的列来保存与信息类型相关的数据。

示例:用户表

UserID UserName
1     | UserName1
2     | UserName2

信息表

InfoID InfoName
1     | FavoriteColor
2     | FavoriteNumber
3     | Birthday

用户信息表

ID    UserID  InfoID  Value
1     | 1     | 1     | Blue
2     | 1     | 2     | 7
3     | 1     | 3     | '11/01/1999'
4     | 2     | 3     | '05/16/1960'

此方法允许您为任何用户保存任何值组合,而无需记录任何未提供的用户信息。 它使信息表保持“干净”,因为您不需要为要跟踪的每条新信息不断添加列。 只需在 Info 表中添加一条新记录,然后只记录提交到 UserInformation 表的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM