繁体   English   中英

您如何构建您打算重用的实体?

[英]How do you structure your entities you intend to reuse?

假设您的数据库中有以下实体:

图片 http://lh6.ggpht.com/_UpGtM3B8h1U/Sa7SqfWmgDI/AAAAAAAAAHE/epqtm7EnoFg/test.gif

您希望能够向所有其他三个实体表(用户、客户和项目)添加注释。 您将如何设置?

  1. 将 tableName 和 FKId 添加到 Note 表?
  2. 为每个关联的注释组(即,ClientNote、UserNote)创建一个单独的表
  3. 在 Note 中为每个外键(UserId、ClientId 等)创建一个单独的字段

我似乎在选项 2 和 3 之间来回切换,尽管如果有一个优雅的实现,我会选择 1。 选项 2 很有吸引力,因为没有空值。 选项 3 很有吸引力,因为无论它与什么相关联,一个便笺感觉就像一个便笺。

有什么想法吗?

我通常会选择 go 和选项 2。我不会在合理范围内强调数据库中的表数量。

最大的问题是,这些笔记会作为一个单一的项目处理吗? 例如,您是否会说“给我看所有笔记,无论是给客户、用户还是项目”。 我想不出任何有用的情况。 你通常会说,“给我看这个客户的笔记”或“给我看这个项目的笔记”。

由于它们在逻辑上不是一个项目,我建议不要尝试将 model 物理上作为一个项目。

我通常看到的处理方式是在选项 1 中。好处是,对于相关人员来说,这是一种相当简单的方法来查看正在发生的事情。 正如你所说,缺点是 SQL 变得不那么优雅了。

不过,事情就是这样。 实际上,即使感觉有点笨拙,生成的查询也是清晰易读的。 您只需将 sql 添加到新代码中,就像您在添加新表的区域中添加 go 一样。

当您实际直接操作笔记时,您只需要处理一张表。

还有第四种方法(我会推荐):在 Note 表中添加一个唯一的 id,在 User、Client 和 Project 中添加一个字段 noteId

做什么可能取决于您需要的注释字段在实体之间是否真正相同。 如果它们相同,我可能会有一个带有 Notetype(用户、客户端、项目)、noteID 和id 来自相应的表以及您需要的所有与注释相关的字段。 最大的问题是必须通过触发器而不是 FK 来管理 FK 关系。 您不想输入无效的用户 ID,但由于整个列不包含用户 ID,因此您不能只设置 FK 关系。 另一方面,如果您稍后添加另一个实体,则可以在不影响表结构的情况下进行操作(尽管您仍然必须修改触发器),这是将 ids 放在单独的字段中的问题。 这也意味着您将无法使用级联更新或删除,这会使删除记录(或更改自然键(颤抖))更加困难。

如果实体之间对注释字段的需求不同,我将为每个实体创建单独的注释表。

如果您要在所有实体之间的每个查询中访问 Notes 表,您可能还需要为每个实体使用单独的表,以减少锁定和阻塞问题。 然而,音符可能不需要经常被击中,所以情况可能不会太糟糕。

选项 3. 将标识作为主键,并为共享 Note 表的任何表提供外键列。 我以这种方式处理 Email、电话、地址等。

我知道的唯一缺点是如果您有 10 个表链接到 Note - 您将有 10 个外键列。

我对选项 1 的问题是,感觉就像您正在创建一个人工外键(使用 TableName/Pkid,它实际上不是用户/项目主键的一部分,它们只是 Pkid)。 这可能只是我个人的偏见,我只是从来不觉得那是好的设计,但我不能确切地说出为什么。

我认为,在这种情况下,您应该明确避免解决方案 1。
您失去了完整性参考,如果没有动态 SQL 就无法查询您的数据库,并且您总是需要对 select 一些注释进行 2 次查询!
你不应该在像这里这样的简单情况下使用这种方式。

正如我所看到的,我使用选项 4 go(在项目、客户和用户上添加字段 note_id)。 如果您需要一行多个笔记,这不是问题。 您只需添加一个额外的表(可以说 note_set)来建立 n-1 关系。

客户(client_id,note_set_id)用户(user_id,note_set_id)项目(project_id,note_set_id)

note_set(note_set_id) note(note_id, note_set_id, title, body)

该解决方案的主要问题是,如果没有在三个表上创建 UNION,您将无法找到初始“实体”。 对我来说这似乎不是一个大问题,但如果是,那么 go 和选项 3。

最后,选项 2 也不错,但不是我所说的“重用”。

请原谅我的英语。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM