【问题标题】:MySQL Database Design with tags across multiple tablesMySQL 数据库设计,带有跨多个表的标签
【发布时间】:2014-05-29 00:33:12
【问题描述】:

我正在开发一些应该使用相同用户表的网络应用程序。不同的应用程序都需要不同的表设计,因此我为每个应用程序创建了一个表,其中 UserID 是引用用户表的外键。

现在我想为所有应用添加标签。每个应用程序的标签应该在一个表中,以便轻松查询一个用户的所有标签(出于搜索目的,搜索应该能够找到带有该标签的所有内容,无论应用程序如何)。就个人而言,我不认为将它们分成多个表会是一个好主意,但我不喜欢数据库设计,所以我可能是错的。我目前的尝试看起来像这样:

[标签]

EntryID | UserID | Tag

问题是,使用此解决方案,EntryID 在所有应用程序表中当然必须是唯一的。对于笔记应用,我需要这样的东西:

[注释]

EntryID | UserID | title | content | etc.

对于我的日历,我有下表:

[日历]

EntryID | UserID | name | start | end | etc.

现在我不知道如何管理这些 EntryID。我应该创建另一个这样的表

[条目]

EntryID | UserID | type

类型类似于“note”或“calendar”,而EntryID 是主键?类型应该是整数还是字符串,还是有可能在类型列中引用另一个表?然后我应该将应用表中的 EntryID 设置为引用条目表的外键吗?

我将用户 ID 放在每个表中,因为我认为这将加快查询速度,例如,当我需要一个用户在所有应用程序中设置的每个标签时。我知道规范化通常会禁止这样做,但我再次认为它会大大提高查询速度并减少 MySQL 服务器和我的后端的负载。

我将不胜感激构建此结构的每一个提示,并在此先感谢!

【问题讨论】:

  • 我不太清楚你在问什么或者你的数据模型的总体意图是什么。例如,您系统中的标签是什么?标签如何与笔记或日历相关联?还有什么是预期的数据访问模式(即如何以及何时对这些表进行各种读取和写入)?就目前而言,还不清楚合适的架构可能是什么。
  • 用户应该能够为日历中的日期添加标签,例如“重要”或“工作”,笔记也是如此。然后他们可以搜索“工作”并找到与他们的工作相关的所有内容,或者搜索“重要”并找到标记为重要的所有内容。当然,当用户更改应用程序中的内容时,会发生对表格的写入,读取会选择接下来两周的日期或最近两周的笔记,或者当用户搜索标签时会发生,然后它必须同时显示笔记和日历的结果。
  • 看来你走在了正确的轨道上。将type 从entries 放入tags。您将需要另一个包含有效type 值列表的表。确保您在表之间维护 RI,可能使用级联删除,因此如果删除了 calendar 行,标签也会消失。您的主要问题是,当您搜索并找到用户“fred”的所有“重要”标签时,您必须根据type 从不同的表中获取数据,然后以某种方式将它们放在一起。这可能会有点混乱。
  • 为了回答关于外键的具体问题,通常使用 int 列完成,具有任意值。所以 1 =“重要”,但您的代码应该对此不可知(不要硬编码1 - 用户从 UI 中的选项列表中选择“重要”,该选项列表是从参考表中填充的,然后查找获取值1,然后用于搜索tags。)将UserID放入每个表中是可以的(这是对性能的反规范化),前提是您注意维护RI并保持数据清洁。

标签: mysql sql database database-design


【解决方案1】:

你可以使用继承,类似这样:

我不确定用户在这里应该扮演什么角色,确切地说。在上面的模型中,用户“拥有”一个条目并(可能)标记它。如果您希望多个用户(能够)标记同一个条目,则需要将 USER 连接到联结表 TAG_ENTITY。

有关如何物理实现继承的更多信息,请参阅here。

您可能还对this 和this 感兴趣。

【讨论】:

  • 感谢您的回答,尤其是链接。我已经在我的数据库中实现了这个方案,现在我只需要完成我的后端:-) 还有一个问题:你用什么程序来制作这些方案?只是好奇,现在我正在手工制作这些,还可以,但看起来不那么漂亮。
  • @Benedikt Visio 2007。
猜你喜欢
  • 2016-05-18
  • 2012-10-09
  • 2023-03-30
  • 1970-01-01
  • 2013-09-03
  • 2011-09-10
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多