我正在创建一个应用程序,它将允许我编写注释并根据标签对它们进行分类。注释主要是术语的定义,但可以是任何东西。它们可以具有任意数量的标签,例如与这些主题相关的注释,例如“经济学”,“历史”,“心理学”等。这样,应用程序的用户就可以根据标签过滤笔记。
我拥有的基本结构是:
一个名为Note
的类对象,它具有三个成员:
Tag
个对象的列表] 另一个类对象是Tag
,它具有三个成员:
Note
的列表] 有一个全局NoteList
,存储所有Notes,还有一个TagList
,存储所有标签。
当用户创建一个新的Note
时,该应用程序将获取标题和定义并将其存储在新的Note
对象中。然后,它将使用用户输入到标签字段中的所有内容,并以逗号分隔字符串(因此,如果用户输入“ psychology,history”,则会生成两个单独的字符串“ psychology”和“ history”。)
然后为每个字符串,例如“心理学”,程序检查TagList
中是否包含该名称的标签。如果不是,它将创建一个新的Tag
对象,将当前创建的Note
添加到该标签的注释列表,然后将新创建的Tag
添加到全局TagList
。如果标签已经在TagList
中,则程序将更新该标签上的注释列表以包括新创建的注释。然后将标签添加到该Note
对象的标签列表中。
完成后,会将Note
添加到全局NoteList
。
Tl; dr 在注释和标签之间存在共生关系-每个注释包含与之关联的所有标签,反之亦然。我这样做是为了确保组织所有便笺很简单-如果您想找出便笺包含哪些标签,请查看便笺的标签列表。如果要找出标签中包含哪些注释,请检查标签的注释列表。
这种双向方法是构造这种应用程序的最合乎逻辑,最明智的方法吗?还是我没有考虑过一种更有效的方法?
答案 0 :(得分:4)
由于Note和Tag类的定义是如此相似,因此我将考虑使用一个类来表示这两种类型,或者让两个类都从一个父类继承。这可以允许您使用相同的代码向用户显示注释或标签。我会更强烈推荐继承方法,因为这可能会使将来的更改和功能添加变得更加容易。
由于每个条目都是唯一的,因此我还建议使用哈希映射来存储TagsList而不是简单的列表/数组。哈希图通常可以提高标签的搜索性能,并且使用大多数主流语言,还可以简化大多数处理标签的操作的代码。
总的来说,您的双向方法很有意义。尽管使注释和标签都保持一种关系,但将其设置为另一种将花费的内存是仅保持一种关系的两倍。但是,考虑到问题的背景和规模,我不希望内存使用成为严重问题。此外,由于您期望双方都需要查看音符/标签关系,因此保持双方设置的关系所带来的性能优势将非常明显。保持双方的关系集将有效地使对相应注释或标签列表的搜索成为线性操作;而否则运算将是指数运算。
答案 1 :(得分:2)
当我看到标题时,我就知道答案了,然后阅读了您的描述(恰到好处,不是很多,不是很多),并且您做了我期望只有似乎了解对象的人所做的事情,您创建了类。但是随后您通过在标签上加上注释来复制信息
标签列表[与笔记相关的标签对象的列表]
以及带有标签的注释
注释列表[包含此标签的所有注释的列表]
您问正确的问题
这种双向方法是最合理,最明智的方法吗 构建这种应用程序,还是我有更有效的方法 没有考虑?
甚至暗示正确的解决方案
笔记和标签之间存在共生关系
我认为您从未使用过NoSQL database,我的偏好是Neo4j或Prolog,我的偏好是SWI-Prolog或RDF triples(我个人不使用这些,因此这些可能不正确,但我怀疑它们是正确的。)
因此,取决于您选择的三个模型中的哪一个,数据建模方式将取决于该方法。
接下来,如果您像大多数程序员一样,您将更加在意代码从一开始的速度,并花时间尝试优化代码。不要这样做,首先获得正确的答案,然后,如果代码运行不快,请使用profiler来找出运行缓慢的位置并采取必要的措施。
这些系统中的大多数都具有显着提高搜索和选择关系的效率的方法,但是您必须阅读大量内容才能了解如何使用它们,例如, Prolog indexing或Neo4j indexes
很抱歉,这方面的细节很少,但是要给出每个示例的工作示例可能会花费我几个小时,因为我没有为每个示例设置开发环境。
答案 2 :(得分:-1)
这是多对多关系的属性。因此,您将构建本机关系数据模型。