sql - 如何规范化可以链接到一个或多个表的表?

标签 sql database database-design relational-database database-normalization

我想知道是否有人能帮我解决一个正常化的问题,当我试图创建一个单独的沟通表,为我的个人项目,我正在工作。假设我有以下表和表列:
表A:
表号、日期、姓名、代理号(FK)、备注
代理表:
代理人身份证、日期、姓名、电话、电子邮件、备注
直接接触表:
身份证、日期、姓名、电话、电子邮件、备忘
上面是我的实际表的一个示例,但是描述了我的问题。
基本上,要将上表规范化为1nf,我需要将notes列拆分为其on separate表,以帮助使表原子化,并遵守1nf规则。我想把它拆分成一个单独的列,叫做communication table,它可以让我跟踪我什么时候与相应的表和我讨论的内容进行对话。
我不知道如何最好地处理分离的通信表。因为表A中的notes也从表中链接到代理,但是代理表中的notes列只与与代理完成的通信有关。
因此,您建议以下哪项最适合通信表:
例1:
通讯表
com_id,日期,link_table,link_table_id,备注
这里,link_表应该定义正在处理的特定表,link_table_id是link_表上的特定id
更新:
抱歉,我忘记了,我还需要在上面添加另一个名为communicated_with的列,因为可能存在与表A相关的通信可能与其他代理或人员发生的实例。
所以这张桌子看起来像:
com_id,日期,链接表,链接表id,通信对象,备注

例2:
通讯表
通讯ID、日期、表ID、代理ID、D C ID、备注
在这里,所有不相关的id列都必须设置为空,而相关的列则用id定义。

例3:
通讯表
账号、日期、备注
在这里,所有其他表都有这个表的外键。(但是,这可能会迫使我重复其余的列,只是为了标识它是一个不同的列)。
更新2
想到了一个新的解决方案,在浏览了一些youtube视频之后,我注意到也许一个连接表可以工作。
例4
通信表(与示例1相同,没有“comminicated_with”列)
com_id,日期,链接表,链接表id,通信对象,备注
通信代理连接表
通讯号,探员号
我觉得这是可行的,因为它允许我使用link_table和link_table_id来匹配所表示的表,最后,当link_table链接到table_a时,可以使用comm_agent_join_id来指定与哪个代理通信。
抱歉,如果答案是直截了当的,我上次做正常化是在两年前,因此一直在努力做到这一点。
谢谢您。

最佳答案

对于如何将表放入1NF,这不是一个答案。不过,我希望这会有帮助。
在创建数据库时,我们通常不考虑1nf、2nf等,而是考虑要建模的对象和实体。当我们仔细考虑后,通常数据库已经在5nf左右了。如果有疑问,我们可以使用nfs作为一种检查表。
我不知道你的具体要求,所以这里有很多猜测或者只是一般性的建议。也许你的问题之一是你使用的名词“notes”并不能准确地描述这是怎么回事。后来你称之为“通信”,但所有的“注释”都是“通信”?
您的数据库是关于您直接从代理或服务公司获取的服务的。我看到的一个实体是这个提供者:
供应商
提供商ID
名称
联系人姓名
电话
电子邮件
类型(代理或最终服务提供商)
如果一个提供商可以有多个联系人、电话和电子邮件,则您可以将其改为提供商联系人表:
供应商
提供商ID
名称
类型(代理或最终服务提供商)
提供商联系人
提供商联系人ID
名称
电话
电子邮件
提供商ID
至于注释:如果有关于提供者的注释(“总是找简,她是那里最专业的。”)或联系人(“简在伦敦和马德里工作过。”),我通常只制作一个文本列,您可以在其中输入任何您喜欢的内容。您甚至可以存储HTML或Word文档。我想每个提供者不需要多个文档。
现在也有服务。要么需要一个谁提供哪个服务的列表,然后添加这些表:service(哪些服务存在)和provider_service(谁提供哪个服务)。但也许你可以这样做,因为你知道哪些服务存在,谁提供它们,并且不想在你的模型中有这种服务。
我不知道你是想咨询服务还是只想订一份固定的服务合同。在任何情况下,您都可能需要一个带状态或不带状态的service_contract表。
服务合同
服务合同
提供商ID(或者提供商联系人ID?)
服务(引用服务表的免费文本或服务id)
有效的
有效的
在这里,你可能会有“我们还在等文件”这样的注释。简说,他们将在2018年3月来。”,这又是一个专栏。
然后你说你想要那封信,那可能是另外一张表:
服务合同
服务合同对应
服务合同
类型(从提供程序接收或发送到提供程序)
文本
但话说回来,也许你可以不用它。您是否需要访问单个对应项(例如,“从2017年12月起给我所有对应项”或“删除所有超过一年的对应项”)?或者一份合同上会有成千上万封信?别这样。也许您可以再次将其视为一个单独的文档(文本、html、word,…)并将其作为一个字段添加到表中。
包含多个联系人的文本,如
2018年1月2日简
她说他们需要几个星期才能提出报价。
2018年1月20日
我问过情况。和托马斯·史密斯谈过了。他说他们明天会打电话给我们。
2018年1月21日简
她已经把合同发电子邮件给我们签了。
不是针对NF1的。只要您对数据库中的细节不感兴趣(例如,您永远不会在合同中单独选择所有一月的通信),那么对于数据库来说,这是原子的;不需要更改。
与联系人相同。如果您只有一个字符串列“jane(销售人员)123-45678 jane@thems.com,jack(助理)123-98765 jack@thems.com”,那么这本身就不是针对nf1的。只要您不想只选择姓名或检查电话号码,但始终将字符串作为一个整体,作为联系人,然后就这样做。
你看,这一切都归结为你到底想建模什么,以及你想如何处理数据。是的,有代理和直接提供程序,但是这两者之间的差异是否太大以至于需要两个不同的表?是的,每个合同都有一个对应关系的年表,但是您真的需要将它们分为数据库中的单个对应关系吗?

关于sql - 如何规范化可以链接到一个或多个表的表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49079754/

相关文章:

sql - 在 PostgreSQL 查询中按降序聚合字符串

NULL 和 VARCHAR 之间的 SQL 并集错误

mysql - 查询建议尚未订阅的前 15 个最活跃用户

python - 使用适当的变量类型将 CSV 文件从 redshift 导出到本地

database - Neo4j基于具有某些属性的其他标签创建新标签

.net - 发布设计审计表以跟踪更改

sql - SQL Server 2012 Express 中的探查器

Php MySQL 通过 MySQL 连接数据库不起作用,但 ODBC 可以

mysql - 如果表中的所有列都是某个唯一键的一部分,可以吗?

database - 我应该创建两个表来存储对象的具体信息吗?