每个用户的专用数据库与用户的专用列
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')
)
我正在使用 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 个字节。但它确实假定使用有效的引用(长而不是字符串)。
- 而不是说每个组件平均免费 space 2k,因此假设 4 个用户的 4 tables 32k 可以(轻松)存储 4000+ 价值的额外列数据。
提取数据的效率可能更高,因为要提取的数据更少并且搜索要求降低(即没有
'WHERE COL_USER_ID LIKE :userId')
)