SQL-在表之间强制执行约束

SQL-在表之间强制执行约束,sql,Sql,我想用SQL对工厂经理的访问进行建模 我有4个要强制执行的约束: 在任何访问中,至少有一名经理参与此访问 经理可以多次访问同一家工厂,但时间不同 经理一天可以参观许多工厂 一个工厂最多只能进行一次参观 我构建下一个2表: visit-Factory(Name Factory, date, during, summary) \\where Name Factory, date are PK visit-manager(Name Factory, data, manager) \\ where N

我想用SQL对工厂经理的访问进行建模

我有4个要强制执行的约束:

  • 在任何访问中,至少有一名经理参与此访问

  • 经理可以多次访问同一家工厂,但时间不同

  • 经理一天可以参观许多工厂

  • 一个工厂最多只能进行一次参观

  • 我构建下一个2表:

    visit-Factory(Name Factory, date, during, summary)
    \\where Name Factory, date are PK
    
    visit-manager(Name Factory, data, manager)
    \\ where Name Factory, date, manager are pk
    
    这将强制执行最后3个,但不强制执行第一个


    有什么想法吗?感谢

    在一个良好的规范化数据库设计中,您需要确保数据重复最少

    从这个角度来看,看看您当前的设计,看看哪里可以删除这种重复


    我不知道您是否已经了解了实体以及如何对它们进行建模,但如果您已经了解了,请思考您需要的不同实体。

    您认为这可以如何实施?我已经考虑过了。如何删除重复?据我所知,1-NF请求删除具有多值的记录。所以我就这么做了,把访问的时间分散到了两张拼写表上。“我怎样才能减少更多的重复?”亚当斯-想想2-NF和3-NF。还可以查看表的名称-是否有重复的内容?但这是必要的(同样,1-NF)。我通过工厂名称和访问日期来确定访问。你是说我需要加入这两个表吗?因为我不明白。谢谢。@AdamSh-我是说你少了一张桌子。参观工厂和参观经理在那里有一个复制品。。。也许这应该是第三张表?很明显你有三个实体。经理(用户)、参观和工厂。布局这三个实体,看看哪个“有很多”其他实体。例如,一次参观“有很多”工厂吗?可能不会。因此,使用这一条指导原则,检查这三种型号的所有3x2x1=6种可能的组合,并使用上述逻辑检查每种组合(第一种,我在上面做的是参观了许多工厂)。这会让你开始。考虑箭头的另一端是“属于”结尾。暂时忽略“多对多”关系。