每个用户的专用数据库与用户的专用列

Dedicated database per user vs Dedicated column for user

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

我试着搜索这个并在 Whosebug 中发现了一些类似的问题。但我无法就此得出任何结论。我得到的唯一一点是,如果你使用第二种方法,那么当用户注销和新用户登录时不需要切换数据库。除此之外,我无法收集这两种方法的任何优点或缺点.

我建议单一数据库方法更实用,整体效率更高。

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

  • 必须使用更复杂的代码和 cpu 资源密集型代码来切换数据库,而不是使用额外的列和 WHERE 子句。但是,这是一个使用基于模板实体 (tables) 的多个数据库的示例,尽管示例

    中只有单个 table
    • 该示例围绕一个主数据库展开,该数据库存储可用数据库以满足新数据库的动态分配。基础 table 可能会扩展以包含列以满足用户所有权和验证。
  • 对相同数量的数据使用更多存储空间space,因为数据将分布在其中一些不会被完全使用的地方,因此至少有更多的免费空间space。成分越多(tables/indexes/view/triggers)影响越大。

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