跨多个表使用标记的MySQL数据库设计

跨多个表使用标记的MySQL数据库设计,mysql,sql,database,database-design,Mysql,Sql,Database,Database Design,我正在开发一些web应用程序,它们都应该使用相同的用户表。不同的应用程序都需要不同的表设计,所以我为每个应用程序创建了一个表,其中UserID是一个外键,指向用户表 现在我想为所有应用程序添加标签。每个应用程序的标签都应该在一个表中,为了方便地从一个用户处查询所有标签,以便进行搜索,搜索应该能够找到所有标记有该标签的内容,无论是哪个应用程序。就个人而言,我不认为将它们拆分成多个表是一个好主意,但我不太喜欢数据库设计,所以我可能错了。我当前的尝试如下所示: [标签] EntryID | UserI

我正在开发一些web应用程序,它们都应该使用相同的用户表。不同的应用程序都需要不同的表设计,所以我为每个应用程序创建了一个表,其中UserID是一个外键,指向用户表

现在我想为所有应用程序添加标签。每个应用程序的标签都应该在一个表中,为了方便地从一个用户处查询所有标签,以便进行搜索,搜索应该能够找到所有标记有该标签的内容,无论是哪个应用程序。就个人而言,我不认为将它们拆分成多个表是一个好主意,但我不太喜欢数据库设计,所以我可能错了。我当前的尝试如下所示:

[标签]

EntryID | UserID | Tag
问题是,使用此解决方案的所有应用程序表中的EntryId当然必须是唯一的。对于notes应用程序,我需要以下内容:

[附注]

EntryID | UserID | title | content | etc.
对于我的日历,我有下表:

[日历]

EntryID | UserID | name | start | end | etc.
现在我不知道如何管理这些入口。我应该创建另一个这样的表吗

[参赛作品]

EntryID | UserID | type
类型是note或calendar,EntryID是主键?类型应该是整数或字符串,还是有可能引用类型列中的另一个表?然后我是否应该将app表中的entryid转换为引用entries表的外键

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


我将感谢你为我提供的每一个建议,并提前感谢你

您可以使用继承,如下所示:

我不确定用户到底应该扮演什么角色。在上面的模型中,用户拥有一个条目并可能对其进行标记。如果希望多个用户能够标记同一条目,则需要将用户连接到junctions表tag_实体

有关如何实际实现继承的更多信息,请参阅


您可能还对和感兴趣。

我不太清楚您在问什么,或者您的数据模型的总体意图是什么。例如,系统中的标签是什么?标签与便笺或日历的关系如何?此外,预期的数据访问模式是什么,即如何以及何时对这些表进行各种读取和写入?目前,还不清楚什么是合适的模式。用户应该能够在日历中的日期上添加标记,如重要或工作,笔记也是如此。然后,他们可以搜索工作并找到与工作相关的所有内容,或者搜索重要内容并找到标记为重要的所有内容。当然,当用户更改应用程序中的内容时,会出现写入表格的情况,reads会选择下两周的日期或上两周的笔记,或者当用户搜索标签时会出现写入表格的情况,然后必须显示笔记和日历中的结果。看起来你的思路是正确的。将条目中的类型放入标记中。您需要另一个包含有效类型值列表的表。确保在表之间维护RI,可能是通过级联删除,因此如果删除了日历行,标记也会被删除。您的主要问题是,当您搜索并找到用户fred的所有重要标记时,您必须根据类型从不同的表中获取数据,然后以某种方式将其组合在一起。这可能会有点混乱。为了回答关于外键的具体问题,通常使用int列完成,该列具有任意值。So 1=重要,但您的代码应该不知道这一点,而不是硬编码1-用户从UI中的选择列表中选择重要,该列表由引用表填充,然后查找该表以获得值1,该值随后用于搜索标记。在每个表中放置UserID是可以的,如果您注意维护RI并保持数据干净,这是性能的非标准化。感谢您的回答,尤其是链接。我已经在我的数据库中实现了这个方案,现在我只需要完成我的后端:-还有一个问题:你用什么程序来制作这些方案?好奇的是,现在我正在手工制作这些东西,虽然还可以,但看起来并没有那么漂亮。@Benedikt Visio 2007。