从这篇文章中,在数据库中存储标签的最有效方法是什么?
建议存储这样的标记表.
Table: Item Columns: ItemID, Title, Content Table: Tag Columns: TagID, Title Table: ItemTag Columns: ItemID, TagID
另一个SO帖子也说了同样的话.任何人都可以解释为什么标签应该像这样存储?我猜测ItemID是一些内部val,title是标签名称(c ++,sql,noob等)内容是我想用我的项目存储的任何其他数据.为什么不喜欢
Table: Item Columns: ItemID, Title,Table: TagList Columns: ItemID, Title
项目中的标题为"项目名称",标题标题为"c ++""sql""noob""etc"
你展示的第二个设计没有任何问题TagList
,除了它需要更多的空间.
也就是说,如果使用标记"database-design"标记10,000个项目,那么在双表设计中,您必须将该字符串存储10,000次.如果空间效率更重要,您可以使用三表设计,它只会将"数据库设计"的4字节整数ID存储10,000次.节省10*10,000字节.
另一个区别是,在三表设计中Tag
,即使它们具有不同的整数ID值,您也可以在表中具有多个具有相同字符串的行.所以在ItemTag
表格中,它们似乎是不同的标签,你永远不会知道它们实际上被标记为类似.而在双表设计中,具有相同拼写的标签隐式地组合在一起.
另一点:如果您需要更改标签的拼写,那么在双表设计中您必须更新许多行.在三表设计中,您只需要更新一行.
最后,如果您通常需要一个唯一标记列表,那么Tags
在三表设计中查询表格会更快,而不是SELECT DISTINCT tag FROM TagList
每次需要唯一列表时都需要.而后者只提供正在使用的标签列表,而不是所有符合条件的标签列表.