关联没有先前关系的表 (SQL Server)

Posted

技术标签:

【中文标题】关联没有先前关系的表 (SQL Server)【英文标题】:Relating Tables with no previous Relation (SQL Server) 【发布时间】:2011-09-13 18:08:01 【问题描述】:

编辑:我换掉了我的结构实现,但我的问题还是一样;即在创建 SvcRequest 记录之前首先创建一个 Publication 对象(如果它尚不存在)。

我得到了一个必须“修复”的数据库,并且对某个特定问题感到非常困惑。为了简单起见,我们有两个已经存在的表(重要的)。我花了一段时间才弄清楚两者之间的关系,最终决定采用传统的联结表如下:

                     Publications (id, SvcReqID, LogID)
                             /              \
                            /                \
               SvcRequest (id)              SvcProgressLog (id)

SvcRequest 和 SvcProgressLog 或多或少是同级表,它们都包含对父级的引用。有一种奇怪的层次关系让我花了一段时间才弄清楚,现在我只需要一种方法来加入它们,这样就可以轻松执行 CRUD 操作。

这里的流程如下:

    一个出版物的服务请求进来了。 如果出版物存在 --> 更新相应的出版物记录。如果没有,请创建一个新的出版物。之后,根据从网络表单捕获的信息创建 SvcRequest 记录。(此处需要帮助) 最后可以为存在但尚未记录的请求创建日志条目。

存在以下关系:

出版物 --> SvcRequest :: 1 --> 许多 出版物 --> SvcProgressLog :: 1 --> 许多 SvcRequest --> SvcProgressLog :: Many --> Many (-ish)

一如既往,我非常感谢您的帮助和智慧之言;) よろしく

【问题讨论】:

你能否从传入的服务请求中判断发布是否存在? @Catcall:很遗憾,不能,必须先对照出版物表进行检查。 【参考方案1】:

由于我们的数据库结构的复杂性以及我在这里称为 SvcRequest 表的所有支持表,我选择编写一系列可以单独运行以“更新”的存储过程(尽管实际上是一个插入) 请求或由主 SP 调用以输入新条目。

经过数小时的思考和设计试验,这是我能想到的最佳解决方案。写完后我会发布一些示例代码,以便其他人也可以受益。 :)

【讨论】:

【参考方案2】:

如果 link_id 不能用于关联 SvcRequest 和 SvcProgressLog 表,那么您需要取消 SvcProgressLog 与 Publication 表的关联,并将其直接关联到 SvcRequest:

出版物>-----+ SvcRequest +-----

【讨论】:

我很难理解您的评论。 :-/ Publications 与 SvcRequest 具有一对多的关系。 SvcRequest 与 SvcProgressLog 是一对多的关系。 不完全是,SvcRequest 实际上与 SvcProgressLog 是多对多的关系。因此需要它们之间的“联结”表。 那么 Publications 是联结表吗?还是它完全是一个独立的实体?如果是后者,则需要 SvcRequest 和 SvcProgressLog 之间的第二个联结表。 本质上是联结表,是的。但它也有一些自己的领域。

以上是关于关联没有先前关系的表 (SQL Server)的主要内容,如果未能解决你的问题,请参考以下文章

在SQL Server中实现关系模型

详解如何定义SQL Server外关键字约束

SQL Server数据库多表关联如何更新?

在Oracle数据库中,如何对两个有关联关系的表进行分页?

SQL数据库中表与表之间的关联怎么建立

Oracle怎样创建关系表与其他的一个表关联