标记数据库的关系数据的优点

时间:2014-09-18 07:52:01

标签: mysql database-design relational-database

想象一个简单的数据库(MySQL),其中包含可以附加到对象的对象和标记。将标记存储在单独的表中(所以你有表标记,对象,tag_has_object)比制作两个表(标记和对象,其中标记不保存为数字而是直接作为字符串)有什么好处。

虽然我习惯于把一切都变成关系,但是有人提议以第二种方式(两张表)来做,而且我不能提出任何反驳论据。一个人有优势吗?

3 个答案:

答案 0 :(得分:1)

主要区别在于您打算如何使用它。

标签为字符串:

  • 易于插入
  • 最终可能会选择慢选择
  • 将使用更多数据

标签为表格:

  • 更难插入
  • 更快的选择查询
  • 将使用更少的数据

因此,如果你的应用程序不是很大,那么使用字符串就没有问题了。

答案 1 :(得分:1)

三表选项意味着您有一个与对象关联的预定义标记列表。两个表选项意味着标签是自由文本,可以是任何值。

在三个表选项中,您是否选择将另一个代理数字键添加到tags表并在链接表中使用此引用,或者使用标记本身作为键和引用这是一个基于实用的选择关于熟悉度,不可约性,稳定性和简单性的标准。考虑到所有这些因素,您需要确定代理键是否适合您的特定情况。

需要考虑的一些事项

只有标签本身的自然键。

  • 不需要加入标签表来获取标签值(熟悉度)
  • 标签表上的一个单列候选键(简单)

使用额外的代理键:

  • 对标签的更改不需要级联到引用列(稳定性)

答案 2 :(得分:1)

值得考虑使用数据的方式。

明显的情况是:

  • 插入新对象,并将其与标记关联。使用两个表格会更容易,只要你不关心验证(“文章”与“文章”相同吗?可能“明白”是一个错字吗?),或者标签是否已经存在。
  • 显示与给定标记匹配的所有对象。使用3个表更容易(也可能更快),因为您只需要比较“tag”表上的字符串,然后加入键(可能是整数)。如果您支持通配符或其他“搜索”功能,这一点尤为重要。
  • 显示“标签云”。使用3个表更容易(也可能更快) - 再次使用你可能需要做的字符串操作。

通常,在插入记录以进行快速检索时,我会接受一些额外的痛苦,因为在大多数应用程序中,您执行的读取次数多于写入次数。