是否有一个商定的标记理想模式

leo*_*ora 20 sql schema tagging

我有一个照片网站,我想支持标签,因为我的原始类别桶开始失败(一些图片是家庭和假期,或学校和朋友).是否有商定的标记数据库架构?

我仍然希望支持将照片作为专辑的一部分.

现在我有几张桌子:

相片

  • PHOTOID
  • PhotoAlbumID
  • 字幕
  • 日期

相片集

  • ALBUMID
  • ALBUMNAME
  • AlbumDate

Jon*_*nan 24

有各种各样的模式是有效的,每个模式都有自己的性能影响,因为标记项目的数量增长,您将需要常见的查询:

就个人而言,我喜欢有一个标签表和一个链接表,它将标签与项目相关联,因为它是非规范化的(没有重复的标签名称),并且我可以在必要时在链接表中存储其他信息(例如当项目被标记时).

如果您感觉活泼并且想要通过在标签表中存储使用计数所需的额外数据维护成本来简单选择,或者存储在项目表本身中使用的标签名称以避免命中,您还可以添加一些非规范化数据.每个项目的链接表和标记表,这对于显示包含所有标记的多个项目以及简单的标记版本控制非常有用...如果您涉及到这类内容;)

  • 您不是说“标准化(标签名称不重复)”吗? (2认同)

Nea*_*all 11

我在没有很多用户的小系统中完成了这项工作,但我之前想知道是否有"接受"的方式来管理标签.在阅读了insin发布的链接以及许多关于标记的其他博客文章之后,似乎可以接受的方法是将其完全标准化存储,并在数据集太大时缓存某些内容.

由于它是一个多关系(每个标签可以属于任意数量的照片 - 每张照片可以有许多标签),因此关系数据库理论可以创建一个照片表,一个标签表和一个交叉引用表来链接它们.

photos
  photoid
  caption
  filename
  date

tags
  tagid
  tagname

phototags
  photoid
  tagid
Run Code Online (Sandbox Code Playgroud)

这有从大型数据集中选择的扩展问题,但所有较不规范化的模式也是如此(例如,文本字段的排序和过滤可能总是比使用整数慢).如果你变得像美味的一样大,甚至可能是StackOverflow,你可能需要对标签集进行一些缓存.

您必须面对的另一个问题是标签规范化问题.这与数据库规范化没有任何关系 - 它只是确保(例如)"StackOverflow","stackoverflow"和"stack overflow"标记是相同的.很多地方不允许空白或自动剥离空白.有时你会看到标点符号相同的东西 - 使"StackOverflow"与"Stack-Overflow"相同.自动小写是非常标准的.你甚至可以看到特殊情况归一化 - 比如使"c#"与"csharp"相同.

快乐标记!