I have an existing webapp and want to add a tag feature so that users can tag existing objects. The question is should I add a tag column to each object? or should I normalize it and use a tag table where each object will have a collection of tags? I am leaning towards the latter because it feels cleaner, easier to report on and easier to create a tag cloud. But since I know this has been solved 1000 times I wanted to ask and see if I am missing something?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
Do you foresee users needing to associate more than one tag with an object?
If not, add the TAG_ID fk to the OBJECT table. Otherwise, you'd need three tables in total to correctly model a many-to-many relationship:
OBJECT
- OBJECT_ID (pk)
OBJECT_TAG_XREF
- OBJECT_ID (pk, fk to OBJECT)
- TAG_ID (pk, fk to TAG)
TAG
- TAG_ID (pk)
回答2:
Yes, you should normalize it. The 'tag column' is either going to support only one tag per record, or is going to have hideous search performance.
回答3:
Definitely normalize. A table for tags, a table for your existing objects, and a table of links between them.