数据库,每个用户一个表还是一个大表?

时间:2018-09-17 01:51:25

标签: mysql sql database sqlite

我刚刚开始学习数据库,在设计数据库时,我注意到很多建议(例如this thread中的建议)建议不要为每个用户使用一个表,而是将所有数据保存在一个大表中,在需要时进行查询。但是我还是不明白,因为似乎在很多情况下,每个用户一张桌子看起来效率很高。

假设我有一个10,000个客户的数据库,供他们跟踪他们的订单。每个客户的订单很少,例如大约10个。这样,每个客户登录后,您将不得不通过一个大表来获取该客户的数据,但是,如果您保留每个用户的每个表,则可以直接获得客户的需求。

另一个例子,一个餐厅信息系统跟踪所有餐厅的菜单(例如,在[食品名称,价格]对中),因为每个餐厅具有不同的菜肴数量,所以您不能真正地将每个菜单放在一行中,只用[foodname,price,restaurant]行组成一个大表。但是有很多餐厅,因此当用户需要某个餐厅的菜单时,您将需要遍历所有餐厅的数据,显然效率很低。

对于这两个示例,如果我不想为每个用户创建每个表,我想不出一种设计数据库的好方法。所以我的问题是这样的: 如果我们想避免每个用户设计的每个表,那么我们应该如何为这种情况设计数据库?

2 个答案:

答案 0 :(得分:2)

Sql数据库是专门为您建议的方案类型而设计的。他们可以非常高效地处理数百万或数十亿行。试图将每个客户划分到一个单独的表中的复杂性很大。

您唯一需要担心的是,您的表上有索引,因此您不必浏览十亿条记录就可以找到适用于客户的记录。

一旦索引到位,您的所有示例方案都将变为简单而高效的查询。

答案 1 :(得分:1)

即使所有用户都在单个表中,数据库也可以有效地精确执行您要描述的各种查找。只要您通过用户ID创建索引(或将用户ID作为主键的一部分),数据库就将按用户ID对表进行排序,因此它可以使用二进制搜索有效地找到任何特定用户。

“表”也不完全是您认为的含义。表旨在用于对程序员有用的方式对数据进行逻辑分组。从理论上讲,您使用的任何数据库都只能包含一个大表,但是如果您知道User表的行看起来像这样,而Message表的行(或其他东西)看起来像那样,则通常更容易推断数据库。实际上,许多数据库实际上只有一个大的底层“表”,所有数据都存在其中。因此,从效率的角度来看,两个用户是在“相同表”中还是在“不同表”中通常根本不重要。

数据库管理软件是基于以下假设编写的:您将拥有相对较少的表(数十个,在极端情况下可能为数百个)。因此,请遵循数据库文档的建议。

相关问题