什么是SQL Server数据结构来表示链接在一起的多个对象?

什么是SQL Server数据结构来表示链接在一起的多个对象?,sql,sql-server,data-structures,recursive-datastructures,Sql,Sql Server,Data Structures,Recursive Datastructures,假设SQL Server数据库中有两个表:dbo.companys和dbo.Contracts 假设我想表示公司和合同之间的一对一关系,以表明合同已授予公司。我只需要创建一个带有外键的联接表,外键是dbo.companys和dbo.Contracts 对于任何有经验的SQL开发人员来说,上述场景都很简单 那么,假设我想做类似的事情,但是每个获得合同的公司都可以分包给另一家公司,而另一家公司可以进一步分包出去 我可能会有一家名为“Acme”的公司,它可能会转包给“邪恶的天才”,也可能会转包给“有预

假设SQL Server数据库中有两个表:
dbo.companys
dbo.Contracts

假设我想表示公司和合同之间的一对一关系,以表明合同已授予公司。我只需要创建一个带有外键的联接表,外键是
dbo.companys
dbo.Contracts

对于任何有经验的SQL开发人员来说,上述场景都很简单

那么,假设我想做类似的事情,但是每个获得合同的公司都可以分包给另一家公司,而另一家公司可以进一步分包出去

我可能会有一家名为“Acme”的公司,它可能会转包给“邪恶的天才”,也可能会转包给“有预算的邪恶”

或者,我“Acme”可能会转包给“邪恶天才”,他们会在预算上转包给“邪恶”,但“Acme”可能会同时将同一合同的另一部分转包给“坠落的铁砧”

我们必须记住,一家公司可能涉及许多不同级别的不同合同,或者系统中可能有一些公司根本没有获得任何合同

什么样的数据结构允许我用SQL描述这些关系


编辑:我正在使用MS SQL Server。

我将使用
合同
表,如:

contract_id primary key,
company_id foreign key (companies.company_id),
parent_id foreign key (contracts.contract_id),
*** contract_level,
*** contract details
contract\u level
在这里是可选的,这取决于业务需求。此查询的最大缺点是无法在一个查询中找到合同的顶级所有者。这可以通过添加类似于
contract\u family
的列来解决。此查询可查看所有顶级合同的合同id链将类似于:

select * from contracts
    left join companies on contracts.company_id = companies.company_id
    where contract_family = ...
    order by contract_level
与一对一(或一对多)关系相同就足够了

SQL允许递归遍历这种关系

我还没有测试下面的查询,但它应该会给你一个基本的想法

WITH RECURSIVE ContractHolders AS (
    SELECT * FROM dbo.Companies AS m 
    JOIN dbo.Contracts AS n ON m.id = n.ContractHolderId
    WHERE m.name = 'Acme'
    UNION ALL
    SELECT m.* FROM ContractHolders AS h
    JOIN dbo.Companies AS m ON m.id = h.ContractRecipientId
    JOIN dbo.Contracts AS n ON m.id = n.ContractHolderId
)
SELECT * FROM ContractHolders;

我猜您使用Microsoft SQL Server是基于您使用的
dbo。
阅读了解更多信息。

“我猜您使用Microsoft SQL Server是基于您使用的dbo。“是的,我知道!这无法工作,因为您将
contract\u id
作为主键,这意味着此表中每个合同只能有一条记录。我想你一定是想把它变成一个外键。我的意思是一个主键,合同id是一些技术标识符(来自自动生成的序列、GUID等)。业务合同编号可以是分组列(表示合同链)或详细信息列(如果可能在链内不同或在链间不唯一)。这看起来与我们最终决定的类似。它基本上是一个树形结构。我在你的问题中添加了标签[sql server]。请适当标记您的问题。我知道微软用户通常把他们的数据库简单地称为“sql”,但这是一种编程语言的名称,而不是它的微软实现。关于微软品牌。。。我打赌如果他们有一个文本编辑器,他们会叫它“word”