我有一个照片网站,我想支持标签,因为我原来的类别,水桶正开始失败(一些照片是家人和假期,或学校和朋友)。是否有一致的标记db架构?
我仍然支持把照片作为相册的一部分。
现在我有几张桌子:
照片
相册
发布于 2008-10-05 20:58:41
有各种有效的模式,随着标记项的数量增加,每个模式都会对您需要的常见查询产生各自的性能影响:
就我个人而言,我喜欢有一个标记表和一个链接表,它将标记与项关联起来,因为它是非规范化的(没有标记名称的重复),并且我可以在必要时将附加信息存储在链接表中(例如,当项目被标记时)。
您还可以添加一些去角色化的数据,如果您想要简单的选择,而代价是在标记表中存储使用计数所需的额外数据维护,或者存储标签名,这些标记名用于避免访问每个项的链接表和标签表,这对于显示多个项目及其所有标记和简单的标记版本非常有用。如果你对这种事感兴趣;)
发布于 2008-10-05 23:24:25
我在一个没有很多用户的小型系统中这样做过,但我以前想知道是否有一种“接受”的方法来管理标记。在阅读了insin发布的链接和大量关于标签的其他博客文章之后,似乎公认的方法是在数据集太大的情况下将其完全规范化并缓存某些内容。
因为这是一个多-多关系(每个标签可以属于任意数量的照片-每一张照片可以有多个标签),关系数据库理论让你创建一个照片表,一个标签表和一个交叉参考表来连接它们。
photos
photoid
caption
filename
date
tags
tagid
tagname
phototags
photoid
tagid这会导致从非常大的数据集中选择数据时出现缩放问题,但所有标准化程度较低的模式也是如此(例如,按文本字段进行排序和筛选可能总是比使用整数慢)。如果您增长到美味的大小,甚至是StackOverflow,您可能需要对标记集进行一些缓存。
您必须面对的另一个问题是标记规范化问题。这与数据库规范化无关--它只是确保(例如) "StackOverflow“、”堆栈溢出“和”堆栈溢出“标记是相同的。许多地方不允许空白,或者自动删除它。有时你会看到标点符号的相同之处--使"StackOverflow“与”堆栈溢出“相同。自动降低是相当标准的。您甚至会看到特例规范化--类似于使"c#“与"csharp”相同。
标记愉快!
发布于 2008-10-05 21:00:02
像这样的事情浮现在我的脑海中:加上这两张桌子
标签
PhotoTags
您也可以将其扩展到相册,在相册和标记之间有一个相交表。
https://stackoverflow.com/questions/172648
复制相似问题