【发布时间】:2017-01-31 16:15:11
【问题描述】:
我对数据建模非常陌生,根据 Microsoft 的实体框架,不允许使用没有主键的表,这显然是个坏主意。我试图弄清楚为什么这是一个坏主意,以及如何修复我的模型以使我没有这个洞。
我的当前模型中有 4 个表:User、City、HelloCity 和 RateCity。它的模型如图所示。这个想法是许多用户可以访问许多城市,一个用户只能对一个城市打分一次,但他们可以多次问候一个城市。因此,我在 HelloCity 表中没有 PK。
关于我如何更改它以符合最佳做法以及为什么这首先违反最佳做法的任何见解?
【问题讨论】:
-
如果你可以添加一个 PK 来做,它们很便宜,而且真的很好。我拥有的每个表都有一个 autoinc 主键。即使我不使用它。您的问题可能更适合代码审查
-
只需将 userid 和 cityid 都设置为您的 pk。它将有额外的好处,您不必弄乱重复项。
-
但是我不能为一个用户添加多个问候语......这个想法是用户可以添加任意数量的问候语......
-
主键在内部用于优化查询,但真正的问题是……如果您只想删除 HelloCity 中的一条记录,您会怎么做?您没有任何东西可以唯一地标识一行。假设有一个小故障导致相同的问候被添加了两次;你会有两行包含完全相同的数据,你不能只删除一个。
-
正如@PaulAbbott 所说,PK 主要用于识别单行以防您想删除它,但更重要的是避免出现不一致。在您的数据库中指定哪些字段组合不能重复总是好的,因为否则您最终可能会遇到一团糟。您的表结构必须反映您的业务逻辑。如果复合 PK 涉及的字段过多,您可能需要创建一个身份字段 (PK) 并为所有这些字段创建唯一索引。
标签: sql sql-server entity-framework entity-framework-6