【问题标题】:Tag schema for an android app安卓应用的标签架构
【发布时间】:2013-09-18 15:57:06
【问题描述】:

我正在一个 android 应用程序中实现标签,需要一些关于以下内容的指针:

  • 用于用户可配置的多标签设置的模式设计
  • 如何优化架构以实现搜索、过滤和简单性。

请注意,我已经查看了一些专注于大型服务器式部署的设计,我正在寻找简单且适用于移动 (SQLITE) 环境中的单个表的设计。

首先想到的是,我正在考虑使用字符分隔的 varchar 来表示关联的标签,例如 #work#meeting#monthly。有更好的设计方法吗?

【问题讨论】:

标签: android sqlite schema


【解决方案1】:

如果您使用这种方法,您将在搜索和过滤时遇到问题,请为您的数据使用一个表格,为您的标签使用另一个表格。

您可以使用第三张表来给出数据和标签之间的关系,但它速度慢且效率低。

现在,为了获得最佳的搜索和过滤性能,请使用标签表中指向数据表的指针列表,这样,如果您按标签过滤,您将获得 O(1) 复杂度。问题是您将缓慢地获取与数据相关的标签。您可以反过来做同样的事情,并将标签列表绑定到您的数据,但您需要做很多工作才能使其有效,因为您必须在更新时同时更新标签和数据。

最后,记住 nr_of_tags

编辑:刚才我看到你只想使用一张桌子。

【讨论】:

  • 我真的很喜欢过滤器的 O(1) 复杂性,这真的很棒,但我有点担心标签在两个地方保持有效,这有点令人担忧。我还希望标签与数据相关的查找能够非常快地发生,因为每次滚动列表(带有数据)时我们都会这样做。
  • 那么我认为最好将信息保留在两个表中。在标签表中保留与之关联的数据,在数据表中保留与其关联的标签。对于您所做的每一项更改,您都必须对数据库进行 2 次更改,为此使用开始事务和结束事务(我认为这是 sqlite 中的方式),因此如果应用程序在提交过程中崩溃,则不会发生更改。
  • 另一种方法是从应用程序开始读取标签,它们不应该那么多,所以你把它们放在内存中。从这里您可以轻松找到适合 O(1) 搜索每个数据元素的数据结构。
【解决方案2】:

我想您必须在将处理卸载到数据库或在您的代码中进行之间做出权衡。

我建议在您的代码中执行此操作,因为一旦您在内存中获取数据,您将避免磁盘读取,并且您可以使用线程等高效地处理应用程序层的处理。

这样您就可以避免在多线程模式下运行 SQLite 本身(因此必须在 db 层处理同步)。

一个非常简单的架构可能是:

ID | TAGS
_________
1  | work,meeting,monthly
2  | home,leisure,yearly

您可以将字符串数组存储为逗号分隔值并使用simple trick 轻松检索它们。

然后你可以使用标准的java集合来映射、排序等

【讨论】:

  • 是的,这也是我的想法。然后过滤变成 O(n),我想这对我来说是可以的,因为它不频繁。
猜你喜欢
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 2011-05-07
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多