eug*_*968 6 sql database-design sql-server-2005 constraints foreign-key-relationship
我想为以下场景设置表约束,我不知道如何做到这一点,或者甚至可能在SQL Server 2005中.
我有三张桌子A,B,C.C是B的子级.B将有一个可选的外键(可能为null)引用A.出于性能原因,我还希望表C对表A具有相同的外键引用.表C上的约束应该是C必须引用其父级(B),并且还具有与其父级相同的外键引用.
任何人都有任何想法如何做到这一点?
总的来说,我没有看到这样做的具体原因——但是,你确实问过。
需要理解的是,关系模型不必遵循 OO 模型。这是一种标准的呈现方式Customer-Order-LineItem。这没有什么问题。

如果我想查找属于某个客户的所有行项目,我必须通过表连接Order,类似于 OO 点点表示法 ( Customer.Order.LineItem)。
select *
from Customer as c
join Order as o on o.CustomerId = c.CustomerId
join LineItem as i on i.OrderId = o.OrderId
where CustomerID = 7 ;
Run Code Online (Sandbox Code Playgroud)
假设我稍微修改一下键,例如:

是CustomerOrderId每个客户的订单序列号 (1,2,3 ...), 是CustomerOrderItemId每个客户订单的行项目序列号 (1,2,3 ...)。每一个都很容易生成,如
-- next CustomerOrderId
select coalesce(max(CustomerOrderId), 0) + 1
from Order
where CustomerId = specific_customer_id;
-- next CustomerOrderItemId
select coalesce(max(CustomerOrderItemId), 0) + 1
from LineItem
where CustomerId = specific_customer_id
and CustomerOrderId = specific_customer_order_id;
Run Code Online (Sandbox Code Playgroud)
现在,如果我想查找属于某个客户的行项目(以及一些客户数据),我可以跳过该Order表。
select *
from Customer as c
join LineItem as i on i.CustomerId = c.CustomerId
where CustomerID = 7 ;
Run Code Online (Sandbox Code Playgroud)
如果我不需要表中的任何特定数据Customer,则根本不需要加入。将此与第一个示例进行比较 - 请记住,获取行项目是目标。
select *
from LineItem
where CustomerID = 7 ;
Run Code Online (Sandbox Code Playgroud)
因此,使用关系模型,通过传播(自然)键,您不必总是在连接中“沿着关系路径停在每个站”。
哪个更好?取决于你问谁。
希望您能够将基本原则转化为您的示例 - 我发现使用通用(A,B,C)很难。
| 归档时间: |
|
| 查看次数: |
1889 次 |
| 最近记录: |