3

我看过很多关于为对象标记构建数据库模式的帖子(例如dlamblin 的帖子Artilheiro 的帖子)。

在我多天的研究中,我似乎找不到的是实现标记模式的模式逻辑,该模式允许将标签分配给用户(例如 LinkedIn 的技能和专业知识系统,其中标签已由用户添加可以被索引和搜索)。这可能就像将有问题的“对象”更改为用户一样简单,但我感觉它比这更复杂。

我希望能够构建几乎完全一样的东西,除了类别。例如,如果我们对 LinkedIn 的一些技能进行分类,我们可以有这样的东西:IT/计算、零售、项目管理等。

我知道有几种常见的方法和架构可以对数据进行分类,特别Nested SetAdjacency List. 我听说过很多关于这两个方面的事情,例如“嵌套集的插入和删除是资源密集型的”,以及“邻接表模型很笨拙、有限,并且不能覆盖无限的深度”。

所以我在一篇文章中包含了两个问题:

  • 关于用户标记技能的粗略示例模式是什么样的,它们可以在其中被索引和搜索,甚至能够为特定标记构建用户池?

  • 鉴于分类的必要性,对这种性质的事物进行分类的最佳方法是什么?

  • 有没有其他我不知道的更适合这个的模型?(哎呀,我认为这是三个问题)

4

3 回答 3

1

鉴于分类的必要性,对这种性质的事物进行分类的最佳方法是什么?

取决于你需要多大的灵活性。例如,如果您可以假设类别层次结构的深度具有固定的限制,例如 1 或 2 级,则邻接列表可能非常好。

有没有其他我不知道的更适合这个的模型?

路径枚举是一种在祖先名称的串联列表中表示层次结构的方法。所以每个子类别标签不仅会命名它自己的名字,还会命名它的父级和任何进一步的祖父级,直到根。

您已经熟悉任何 shell 环境中的绝对路径名:“/usr/local/bin”是“usr”、“local”和“bin”的路径枚举,它们之间的层次关系按字符串的顺序编码.

这个解决方案也有可能出现数据异常——为“/usr/local”和“/usr/local/bin”创建一个条目是你的责任,如果你不这样做,有些事情就会开始崩溃。

关于用户标记技能的粗略示例模式是什么样的,它们可以在其中被索引和搜索,甚至能够为特定标记构建用户池?

在数据库中实现这一点几乎就像单独命名标签一样简单,但它要求您的标签“名称”列足够长以存储层次结构中最长的路径。

CREATE TABLE taguser (
 tag_path VARCHAR(255),
 user_id INT,
 PRIMARY KEY (tag_path,user_id),
 FOREIGN KEY (tag_path) REFERENCES tagpaths (tag_path),
 FOREIGN KEY (user_id) REFERENCES users (user_id)
);

索引与简单标记完全相同,但如果您从层次结构的根指定整个字符串,则只能搜索子类别标记。

SELECT user_id FROM taguser WHERE tag_path = '/IT/Computing'; -- uses index

SELECT user_id FROM taguser WHERE tag_path LIKE '%/Computing'; -- can't use index
于 2013-05-03T14:47:44.150 回答
1

你没有说哪个数据库,所以我将扮演魔鬼的拥护者并建议它如何在 MongoDB 中工作。像这样创建您的用户:

db.users.insert({
  name: "bob",
  skills: [ "surfing", "knitting", "eating"]
})

然后创建一个关于“技能”的索引。Mongo 会将数组中的每个技能添加到索引中,以便快速查找。查找具有 2 种技能交集的用户与 SQL 数据库的性能相似,但语法要好得多:

db.users.find({skills: "$in": ["surfing", "knitting"]})

好处是单个磁盘查找将获取您需要的用户的所有信息。缺点是它需要更多的磁盘空间和更多的 RAM。但是,如果它可以避免由连接引起的磁盘寻道,那可能是一个胜利。

于 2013-05-03T14:28:08.127 回答
1

我认为最好的逻辑与您链接的帖子中的状态相同

+------- +
| user   |
+------- +
| userid |
| ...    |
+--------+

+-------- --+
| linktable |
+-----------+
| userid    | <- (fk and pk)
| tagid     | <- (fk and pk)
+-----------+

+-------+
| tag   |
+-------+
| tagid |
| ...   |
+-------+

去海事组织的方式非常好。如果您想对标签进行分类,您总是可以将类别表附加到标签表

于 2013-04-26T15:37:02.697 回答