我们在SQL上有一个DB,我们有一个用户的表(1)和一个用于保存用户信息的表(2)。每条信息都是表(2)中的一行。所以我的问题如下 - 如果我们打算将用户数增加到超过1.000.000并且每个用户可以拥有超过10条信息,以下哪一种是构建我们数据库的更好方法:
a)有2个表 - 1个用户,1个用于所有用户的信息,与ID
的用户相关b)为每个用户设置一个单独的表。
提前致谢。
答案 0 :(得分:0)
肯定应该为用户提供单个表格要好得多。从DB的角度思考。您正在考虑排序ID的1.000.000行中的搜索时间。在第二种情况下,您必须搜索1.000.000表才能进入正确的表格。所以最好选择 A 。
答案 1 :(得分:0)
我将同意选项A是所提出的两个选项中的更好选择。
话虽如此,我个人也会将用户的信息分解为更多表格。这将使用外键进行连接,并允许更具体地查询信息。
SQL实际上不是水平可伸缩的,因此如果您的用户信息量少于其他用户,那么您将拥有NULL列,这需要以各种方式进行处理。
通过使用单独的表格,您仍然可以包含所有信息,但如果一个用户拥有家庭和手机号码,则不必担心,而另一个用户只有一个手机号码。
如果您确实需要一次访问大量信息,SQL非常擅长通过连接等处理此问题。
选项B不错,它只是不适合SQL。如果有问题的数据库是基于文档而不是表格,我会工作。在这种情况下,为每个用户创建单个文档是个好主意,并且可能是首选。
答案 2 :(得分:0)
选项C) 具有唯一UserID作为聚簇索引(主键)的用户的表 表格,用于保存信息的类型,其中唯一的InformationID为聚簇索引(主键) UserInformation的表,其中唯一的UserInformationID为聚簇索引(主键),UserID列(非聚簇索引,用户表的外键)和InformationID列(非聚簇索引,信息表的外键)。有一个“值”或类似的列来保存与信息类型相关的数据。
实施例: 用户表
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表的值。