使用taglist字段,所有标签用空格分隔,还是使用2个表(tag:tagid tagtext,tagitem:tagid,itemid)会更高效吗?以数据库方式处理标签的更有效方法是什么?
回答
效率在很大程度上取决于你在做什么。如果您想基于标签名称进行查询,那么如果您在标签和项目表上同时使用标识符(即选项#2)的标签表,则可能会更快。但是,除非你有成千上万的行,否则它可能不会有所作为。如果你根本没有这么多的标签,那么差距会更小。
但是,如果您想通过商品ID获取标签,第一种方法会稍微快一点。再次,我怀疑你会注意到。
还有其他一些考虑因素:数据完整性和规范化。如果您使用两个表和外键,那么让您的标记集与项目保持一致更容易。如果标签被移除,而您只使用一张桌子,则旧的项目仍然会有旧的标签。此外,获取唯一标签列表并保持一致性更容易。如果您在另一个表中有标签,这将打开一个全新的组织世界:您可以为标签创建和修改制作时间戳,将标签标记为活动或非活动状态(可能还有其他状态)等。
一张桌子会更有效率,但有两张桌子通常是存储简单标签的正确方法。
第二个选项。分开存储标签。如果将它们存储在单个字段中,您将无法编写好的查询来搜索特定的标记。您不想使用MATCH或LIKE来过滤标签。通过将它们存储在单独的表格中,您可以轻松找到所需的标签以及相关的文章。不过,您的表格确实需要进行正确的索引。
如果您需要查询这些值,请不要在数据库中存储逗号/空格/其他分隔值。数据库的全部本质是以结构化的方式存储数据。这样数据库可以在很大程度上优化数据的检索。
绝对说话(例如:“从不”)可能是危险的。 IIRC StackOverflow例如使用第一个选项作为其标签(以及第二个选项)。 – NullUserException
@NullUserException出于好奇,第一个选项和第二个选项意味着什么? – Lior
当然,你永远不应该说永远。总是有例外。甚至可能有数据库支持在逗号分隔的字段上使用智能索引的“标记”字段类型。但是*一般来说*你不应该以这种方式存储分隔值。如果你还没有那么有经验的话,在你对此事有足够的了解以故意违反一些规则之前,'永不'是一个好的经验法则。 ;) – GolezTrol
第二个版本,将数据分割成两个额外的表,是很多更有效,因为它允许数据库使用索引来运行的查询你大多需要(Get all texts with a certain tag
,get a count of how often the tags are used sorted by count
的标签云,和get all tags for the given text
)
- 1. 以MVVM方式处理html5视频标签的正确方法是什么?
- 2. 什么是一些更有效的方式来处理查询?
- 3. 什么是处理数据库中大量表的最有效方法?
- 4. 处理SQLite数据库的最佳方式是什么?
- 5. PHP:什么是更好的方式来处理表单数据?
- 6. 在Git中处理数据库的正确方法是什么?
- 7. 什么是处理数据库的正确方法?
- 8. 什么是从其他数据库更新表数据的最有效方法?
- 9. 以非编程方式处理SQL Server数据的最佳方式是什么?
- 10. 处理标签外部文本的正确方法是什么?
- 11. 将数据库导入Django/Postgres的有效方法是什么?
- 12. 什么是通过HTTP POST处理大量数据的有效方式?
- 13. 什么是最有效的方式来处理这个功能?
- 14. 构建此错误处理的最有效方式是什么?
- 15. 将数据加载到db的更有效方法是什么?
- 16. 什么是为数据框创建模式的有效方法?
- 17. 处理从套接字读取数据的最有效方法是什么?
- 18. 使用python处理大量磁盘数据的最有效方法是什么?
- 19. 将标签插入表格的最有效方法是什么
- 20. 处理“hg import”拒绝的最有效方法是什么?
- 21. 处理来自textarea的多行数据;更有效的方式?
- 22. 什么是创建更新Oracle数据库的编排的最有效方法?
- 23. 处理整数数据类型是否有更有效的方法?
- 24. 什么是处理AVCaptureVideoDataOutput有关方向的图像数据的推荐方式
- 25. 处理一对多数据更新的有效方法
- 26. 是否有重构此SQLite数据库处理程序的有效方法?
- 27. 处理可选方法参数的常用方法是什么?
- 28. 处理复杂直方图数据的最有效方法?
- 29. 如何以最有效的方式更新数据库?
- 30. 什么是以编程方式删除大型数据库的最佳方法
其中之一,是。这很大程度上取决于您的数据库结构(迄今为止)以及您想要达到的目标(根本)。 – KingCrunch