【问题标题】:How to implement the right relationships between tables?如何实现表之间的正确关系?
【发布时间】:2018-11-05 00:14:03
【问题描述】:

大家好,

我计划为我的公司更改当前的后端。我打算用asp.net coreef core 创建新的Web 服务。老实说,我被架构困住了。

我不知道应该如何实现实体框架表之间的关系。员工职位不止一个。而且我不想为这个架构实现角色层。所以我创建了这样的表格:EmployeesCashiersPackers、...等。然后将它们设计成这样:Employees (EmployeeId, EmployeeName, ...) Cashiers (EmployeeId, Fee, ...) 但是我在某处读过没有办法在 sql 中使用 1 对 1 关系。那么如何实现这种关系呢?

ER图: Entity Relationships

【问题讨论】:

  • SQL 中的一对一关系没有错。为什么这么说?
  • @TheImpaler 我在这里读过它stackoverflow.com/questions/10292355/… 我的意思是我很困惑。
  • 您创建的单独表格似乎没有添加特殊属性。如果这是您需要的数据,您可以简单地将单个表 Employee 与属性 Fee 和属性 Position 映射到 enum 或 FK 到另一个描述位置的表。
  • @IvanStoev 首先感谢您的帮助。我打算使用映射枚举方式。这只是问我问题的代表性数据。实际上,我已将它们分成表格,因为系统上的所有员工都将访问面板,并且可以访问对另一个人的操作进行的更改。我认为控制这些逻辑会容易得多,而不是为所有员工职位实现整个角色逻辑。
  • Google SO re 数据库/sql 子类型/层次结构/多态性。 PS请不要通过cmets澄清,编辑你的帖子。请use text, not images/links, for text (including code, tables & ERDs)。使用图像仅是为了方便补充文本和/或无法在文本中给出的内容。如果您有代表,请使用编辑功能内联,而不是链接 - 使您的帖子独立。永远不要给出没有图例/键的图表。

标签: sql asp.net database relational-database entity-framework-core


【解决方案1】:

如果您使用的是 SQL Server,那么我同意,不可能建立真正的一对一关系。

关系需要为 1:0..1,因为您需要先插入一行,然后再插入另一行。在最短的时间内,关系会是 1:0,然后会切换到 1:1。

要实现真正的一对一,您需要使用名为Constraint Deferrability标准 SQL 功能。不幸的是,据我所知,此功能仅在 PostgreSQL 和 Oracle 数据库中可用。在这些数据库上,您可以真正拥有 1:1 的关系,因为约束不是在每次插入行时都验证,而是在事务结束时验证。

话虽如此,我也不会太在意。如果您使用数据库事务执行插入,那么我不明白为什么这会导致任何问题。使用类似的过程:

  1. 开始交易。

  2. 插入表格Employee

  3. 插入表格Cashier

  4. 提交事务。

这应该确保您永远不会有没有相关表的悬空员工。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    相关资源
    最近更新 更多