Database design 异步BI的标记驱动数据库

Database design 异步BI的标记驱动数据库,database-design,tags,nosql,Database Design,Tags,Nosql,我在设计标签驱动软件的架构时遇到了一个小问题 我想做的是在数据库中存储纯文本,这是所有者和其他实体喜欢的。纯文本中充满了标签,就像twitter的hashtags一样,应该是可搜索/可索引的。 这可以在应用程序端完成,因此我将有大量的小块数据需要为业务智能处理 没有人会准备好纯文本,它只是关于分析,不需要一致性,可以异步运行 我知道Twitter使用了几个数据库:Gizzard和Cassandra用于推特,FlockDb用于关系 我不想用混合型来建立关系,我也不想建立下一个社交网络。但我需要做的

我在设计标签驱动软件的架构时遇到了一个小问题

我想做的是在数据库中存储纯文本,这是所有者和其他实体喜欢的。纯文本中充满了标签,就像twitter的hashtags一样,应该是可搜索/可索引的。 这可以在应用程序端完成,因此我将有大量的小块数据需要为业务智能处理

没有人会准备好纯文本,它只是关于分析,不需要一致性,可以异步运行

我知道Twitter使用了几个数据库:Gizzard和Cassandra用于推特,FlockDb用于关系

我不想用混合型来建立关系,我也不想建立下一个社交网络。但我需要做的是分析所有标签与其他实体的关系

如何解决哈希标记问题,或者如何处理文本以使其正常工作

我真的在寻找一个好的解决方案,而不仅仅是任何解决方案。我真的知道如何为SQL创建模式


感谢您帮助我度过了数据库的丛林。

以下是在数据库中表示标记的一种相当标准的方法:

应用程序解析原始文本,对于每个标识的标记,检查它是否已经在标记中,如果没有,则将其插入标记中。然后,通过插入TAG_post,将post与从中提取的标签连接起来

注意TAG_POST复合主键中字段的顺序-在前缘具有TAG_ID有助于高效搜索给定标记的POST。如果要获取给定帖子的标签,请翻转顺序。如果两者都需要,则按与主键相反的顺序创建一个复合索引

如果您的DBMS支持,TAG_POST将是一个很好的候选


如果DBMS支持前沿索引压缩(Oracle),那么简单地考虑一下:


压缩索引将有效地存储同一标记名的许多重复,因此不需要为了节省空间而将其“外包”到另一个表。

谢谢您的回复,但我不是在寻找一个好的模式。我更需要一个聪明的数据库。我需要存储数以百万计的标签,并根据实体或其他实体对它们进行汇总。这不需要一致,但需要快速/预处理。“好的模式”和“聪明的数据库”之间有什么区别“根据实体或其他实体对它们进行汇总”到底意味着什么?我指的是像SQL(基于行或列)或基于文档、对象或图形的数据库。总之,我指的是计数(在SQL trems中)。@John上面的模型可以让你相当有效地计数。例如(在第二个模型中):
SELECT COUNT(*)FROM TAG_POST,其中TAG_NAME='sometag'
返回使用给定标记标记的帖子数量,并将仅通过仅索引范围扫描执行(在第一个模型中也是主要的仅索引范围扫描,但您需要使用连接进行稍微复杂的查询)。如果这还不够好,请使用第一个模型,并(通过触发器)将当前计数作为标记表中的一个字段进行维护。@John在注释清晰可见时,无需在答案中重复相同的文本。至于触发器,您将需要一个字段,如TAG.POST\u COUNT,然后在TAG\u POST上创建一个在删除、插入或更新触发器后适当增加/减少该字段。只需在其他可能并发更新的上下文中谨慎地执行此操作-要么使用锁定(
SELECT..FOR UPDATE
),要么在单个语句中执行此操作(例如
UPDATE TAG SET POST\u COUNT=POST\u COUNT+1,其中TAG\u ID=:NEW.TAG\u ID
)。