【问题标题】:How to convert a 1:1 relation into a 1:N relation如何将 1:1 关系转换为 1:N 关系
【发布时间】:2019-04-02 07:50:36
【问题描述】:

我有一个没有很好实现的数据库 SQL 和一些问题。

1.fk 似乎效果不佳,我必须进行单独的查询以在所有表​​中添加值,

  1. 第一个表很奇怪但是是正确的,它必须在tab tabList和tabSE中同时与其他表分开(我要添加,取消,修改)。

  2. 我要在 tabSE 和 tabSD 之间实现 1:N 的关系(不知道怎么做)实际上目标是选择(形成 c# bla bla bla)一堆项目,单击开始并存储在 mm/dd/yyyy 那天我已经启动项目(通过单击按钮开始)的信息,例如 id (1,5,3,6,8) 并且开始有一个结果 bla bla bla,它结束了这一天 mm/dd/yyyy。我认为Union 可能是没有意义的,从tabSD 可能Nome 我不必存在,不知道。帮助

【问题讨论】:

    标签: sql-server ddl


    【解决方案1】:

    从上到下:

    1. 如果您在 tabStoreExec 和 tabStoricoDetail 之间有一个 FK,那么您唯一可以自动执行的两件事是 UPDATEDELETE 使用关键字(或配置表)CASCADE

    2. 我想这是一个“临时”表,用作接口实用程序的背面。

    3. 用于制作 1:N。我认为最好的方法是删除表联合,然后你必须在tabStoricoDetail上创建一个复合键,例如id和idDetail,让FK完成他的工作链接只是两个表的ID:

      tabStoreExec.idSE -> tabStoricoDetail.id
      

    我给你一些 CREATE TABLES 代码示例,它们会按照你的意愿工作:

    CREATE TABLE tabStoreExec (
        idSE INT --PRIMARY KEY --Coul be done here, but can't be named
        , nomeItem VARCHAR(100) NOT NULL --or maybe could be NULL
        , DateStarSE DATE --or DATETIME, depends if you want the time too
        , DateEndSE DATE
        , CONSTRAINT PK_tabStoreExec PRIMARY KEY (id)
        , CONSTRAINT FK_tabStoreExec_idSE_id FOREIGN KEY (idSE) REFERENCES tabStoricoDetail(id) ON DELETE CASCADE ON UPDATE CASCADE --use this in case you want to propagate the delete/update action from this table to referenced.
    );
    
    CREATE TABLE tabStoricoDetail (
        id INT
        , idDetail INT
        , nomeItem VARCHAR(100) NOT NULL --or maybe could be NULL
        , resItemDet VARCHAR(100)
        , CONSTRAINT PK_tabStoricoDetail PRIMARY KEY (id, idDetail)
    ); 
    

    希望对你有所帮助。

    编辑: 是的,Union 表可以消失。

    FK 是两个表之间的“连接器”,它为您提供数据完整性,并且复合 PK 可以具有 1:N 关系。我在这里给你一个示例模式以获得更好的帮助:

    Sample Schema

    【讨论】:

    • 谢谢你的回答,我开始失去希望了。所以联盟你认为会消失吗?然后是 idSE 和 id 之间的 fk 并实现 1:N?我要连接什么?
    • 很抱歉这个奇怪的问题只是想在触摸数据库之前确定一下因为我不知道要回去:')
    • PRIMARY KEY (id, idDetail) 不明白 TSE 和 TSD 之间的链接方式或链接位置 id 和 idDetail 仅在 tsd 中声明
    • 您能给我一些反馈吗?
    【解决方案2】:

    一般而言,您应该将帖子限制为一个问题,而不是多个问题。这样的帖子很难在论坛上讨论。您的问题也涉及许多不同的领域。我建议您首先关注特定领域 - 特别是架构。一旦架构是地址,您就可以开始定义您希望提供的接口。

    而且像“似乎效果不佳”这样的 cmets 并没有用处。唯一了解任何细节的人是你。

    此时,您的架构实现了 tabStoreExec 和 tabStoricoDetail 之间的 M:M 关系。为了后代的爱,真的要考虑一下您的命名标准。您不需要一个命名标准,其中对象类型是每个名称 IMO 的第一部分。也不知道“StoreExec”是什么意思。 /咆哮

    但在继续之前,请解释一下您创建“Union”表的原因(另一个糟糕的命名选择)。该联结表是用于实现 M:M 关系的机制。这是有原因的吗?你改变主意了吗?还有什么困难?

    如果您想要一个 1:M 关系,您应该删除该表并简单地将 tabStoricoDetail 中的外键列添加到 tabStoreExec。我建议您检查 Microsoft 为演示 SQL Server 功能而创建的示例数据库 - AdventureWorks and World Wide Importers。 AdventureWorks 最初是为 2005 版本开发的,但仍然是常用的参考。使用这些是如何定义模式的示例。

    【讨论】:

    • 你的答案的问题是如何?我应该添加另一个构建为 fk 的列吗?
    • 你给我的答案是错误的,关系是 M:1 因为从 TSE 中选择的每个项目都有一个结果,我必须从结果的总和中创建一个汇总结果items 并将其放入 TSD 所以答案是错误的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多