如何更好地构建数据库

时间:2016-05-06 14:24:21

标签: mysql sql database database-design relational-database

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

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

的用户相关

b)为每个用户设置一个单独的表。

提前致谢。

3 个答案:

答案 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表的值。