【发布时间】: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