【问题标题】:Dedicated database per user vs Dedicated column for user每个用户的专用数据库与用户的专用列
【发布时间】:2021-11-06 06:00:19
【问题描述】:

我正在使用 Androidx-Room 创建一个数据库。它包含 3-4 个表并存储一些属于用户的数据。现在我打算在同一设备中添加多用户登录。在这种情况下,最好的策略是什么?我应该为每个用户创建具有相同架构的新数据库(属于特定用户的数据可以用数据库名称来标识,如“myappname_$userId”)还是应该在数据库中的每个表中添加一列以指示该行属于哪个用户(可以通过更改现有查询添加“WHERE COL_USER_ID LIKE :userId”来识别属于特定用户的数据)。

我尝试对此进行搜索,并在 StackOverflow 中发现了一些类似的问题。但我无法就此得出任何结论。我得到的唯一一点是,如果您使用第二种方法,则在用户注销和新用户登录时无需切换数据库。除此之外,我无法收集这两种方法的任何优缺点.

【问题讨论】:

    标签: android database-design android-room


    【解决方案1】:

    我建议单一数据库方法总体上更实用、更高效。

    使用多个数据库,您将:-

    • 必须有更复杂的代码和 cpu 资源密集型代码来切换数据库,而不是有一个额外的列和 WHERE 子句。然而,这是一个使用多个基于模板实体(表)的数据库的示例,尽管在示例 Can Android Room manage multiple databases and create databases from a template database?

      中只是单个表
      • 该示例围绕一个主数据库展开,该数据库存储满足新数据库动态分配的可用数据库。基础表可能会扩展为包含满足用户所有权和验证的列。
    • 为相同数量的数据使用更多存储空间,因为数据将分布在其中一些不会完全使用的数据中,因此至少需要更多的可用空间。组件(表/索引/视图/触发器)越多,影响就越大。

      • 而不是说每个组件的平均可用空间为 2k,因此假设 4 个用户的 4 个表,32k 可以存储(轻松)4000+ 价值的额外列数据。
        • 这假设最坏的情况是每个 id 有 8 个字节来引用用户。然而,一个 id (INTEGER) 可以占用 1 个字节。但它确实假设使用有效的引用(长而不是字符串)。
    • 也许提取数据的效率更高,因为要提取的数据更少并且搜索要求降低(即没有'WHERE COL_USER_ID LIKE :userId')

    【讨论】:

      猜你喜欢
      • 2021-11-29
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      • 2011-11-24
      • 2020-12-11
      • 2023-04-05
      • 1970-01-01
      • 2015-10-14
      相关资源
      最近更新 更多