创建数据库表
Posted
技术标签:
【中文标题】创建数据库表【英文标题】:Creating database table 【发布时间】:2012-08-15 15:12:56 【问题描述】:我正在创建一个用于调查的数据库表,我需要记录报告事件的人,这可能是来自供应商或用户表的记录。最简单的方法是在我的调查表中同时包含一个 suppleir 和一个用户 id 列,但这似乎是错误的,有什么更好的方法来做到这一点?
谢谢。
【问题讨论】:
供应商是个人还是公司?如果他们是人,为什么他们不能与其他用户共享一张桌子? (您需要公司的联系人/信息,因此您可能希望将所有人员放入单个users
表中并相应地链接到其他表,即从 users
到 company
。因此,您真正您数据库中每个人的唯一 ID,无论他们是谁,为谁工作,您只需要一列用于事件报告者。)
【参考方案1】:
您可以有另外两个表 - IncidentsReportedBySupplier (IncidentID, SupplierID)
和 IncidentsReportedByUser (IncidentID, UserID)
- 这将删除空列。
但这也有缺点。然后,您可能会遇到任何人都没有报告的事件。
【讨论】:
他声明他必须记录报告事件的人。只要总是有一个“报告者”,他最好避免创建一个中间表(这对多->多关系最好),更不用说两个这样的表了。 创建一个中介比拥有两个冗余表来存储几乎相同的数据更好。您不必搜索多个地方即可找到“事件”【参考方案2】:我不知道为什么您的选项“似乎是错误的”。我通常更喜欢您的方法,而不是拥有一个包含 FK 的列而不是多个表。您的方法虽然可能需要在另一列中使用空值,但更加直接和明显。无需任何文件。没有不必要和多余的表格...只是一个额外的列。
一般的经验法则,更少的表格 = 更少的关系需要担心 = 更少的头痛。
【讨论】:
这是一个可怕的经验法则。为什么不将所有数据放入一张表中?或 Excel。 应根据您拥有的数据类型及其使用情况仔细规划标准化。 2NF 并不是每个人和每个场景的答案。你不同意 3 张桌子比 15 张桌子更容易维护吗?为什么这么可怕? 15 对我来说似乎更可怕。 过度规范化通常会导致性能问题...不需要具有数据类型的表...;)但是对于较小的系统...性能不是问题...跟随KISS 规则。 (保持简单愚蠢) 不,我不同意从一个糟糕的设计开始,因为某些错误的易于维护的理想而违反了数据库设计的每条规则,这是一个好主意。这并不简单,它令人费解且晦涩难懂。这听起来更像是对傻瓜规则保持愚蠢。 没有数据库设计的“规则”只是指南。如果有“规则”,为什么我们需要建筑师?就像我们做基本代数一样遵循“规则”。每个系统都有不同的需求。您的意思不是建议每个数据库都应该规范化为 XNF?!?!我的评论并不像你想象的那么“可怕”...... ;)【参考方案3】:如果供应商和用户表都具有互斥的唯一 ID 号,则可以有一个列将该 ID 用作“报告者”。
如果它们都具有可能具有重叠值的唯一 ID 号,您可以使用两列作为 ID,例如:
`reporter_id`,
`reporter_type`
类型可以是s
或u
之类的值,以反映表名。这也将消除您建议的方法创建的所有那些空值。
最后,如果他们两个表都没有唯一的 ID 号,给他们一个!关于人的数据表使用主键效果更好!
【讨论】:
我说它可能不一定是......其他选项,因为只有两个可能的值是:TINYINT 其中 0 是供应商,1 是用户 VARCHAR(1) 其中 's ' 是供应商,而 'u' 是用户的想法是通过让价值自我记录本身来减少未来的混乱。 这是一种多值依赖的形式,因此违反了第四范式。以上是关于创建数据库表的主要内容,如果未能解决你的问题,请参考以下文章