【问题标题】:database, a table for each users or a big table?数据库,每个用户一张表还是一张大表?
【发布时间】:2018-09-17 01:51:24
【问题描述】:

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

假设我有一个包含 10,000 名客户的数据库,供他们跟踪订单。每个客户的订单很少,大约 10 个。这样,每个客户登录,您将必须通过一个大表来获取该客户的数据,但是,如果您为每个用户保留每个表,您可以直接得到客户需要的东西。

另一个例子,餐厅信息系统跟踪所有餐厅的菜单(例如,在 [foodname, price] 对中),由于每家餐厅的菜数不同,您不能真正将每个菜单放在一行中,您可以只用 [foodname,price,restaurant] 行制作一张大桌子。但是餐厅很多,所以当用户需要某家餐厅的菜单时,就需要遍历所有餐厅的数据,显然效率很低。

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

【问题讨论】:

    标签: mysql sql database sqlite


    【解决方案1】:

    Sql 数据库专为您建议的场景类型而设计。它们可以非常有效地处理数百万或数十亿行。尝试将每个客户分区到单独的表中的复杂性是巨大的。

    您唯一需要担心的是您的表上有索引,这样您就不必扫描数十亿条记录来查找适用于您客户的记录。

    一旦索引到位,您的所有示例场景都将成为简单高效的查询。

    【讨论】:

      【解决方案2】:

      数据库旨在准确地执行您所描述的查找类型,即使所有用户都在一个表中。只要你按用户 ID 创建索引(或将用户 ID 作为主键的一部分),那么数据库将保持表按用户 ID 排序,因此它可以使用二进制搜索有效地找到任何特定用户。

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

      数据库管理软件是基于这样一个假设而编写的,即您将拥有相对较少的表(数十个,极端情况下可能有数百个)。因此,请使用您的数据库文档建议的任何内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-14
        • 2014-01-31
        • 2011-04-30
        • 2017-09-01
        • 2011-02-15
        • 2012-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多