数据库设计循环参考

时间:2017-09-26 07:49:51

标签: c# sql sql-server entity-framework

我正在尝试修改C#.NET MVC Web应用程序和现有数据库以实现一些新功能。但是,尽量尝试,我不能修改数据库结构而不创建循环引用,我希望有人可能有解决方案。

我想实现一种订单路由方法。因此,根据客户设置的阈值,订单将根据订单大小以两种方式之一生成。所以我发现当我设计数据库时,客户需要引用路由表,因为它决定了订单何时应该到达的位置。此外,由于订单附加到路线,它还需要引用路由表,从而产生循环引用:

enter image description here

客户,产品和订单已经投入生产,因此如果需要,我会担心修改这些关系。

非常感谢任何帮助! 提前谢谢。

2 个答案:

答案 0 :(得分:1)

顺便说一下,你没有循环参考! 如果我理解了这个问题,您希望使用两个路径之一(阈值以上和以下)配置每个客户。然后,订单将按照该路线(订单路线)

首先,上述三种关系中foiregn键的含义是不同的,一个决定偏好,一个决定实际

然后,订单所采用的实际路线是附加到它的路线。如果您不需要跟踪历史记录(例如,当客户受限于其中一个时,此订单如何采用此路线?)那么我看到您的设计 - 对于此特定问题 - 是有效的

我仍然不知道为什么PRODUCT表与客户的关联方式如何!也许这是一个CUSTOMER_PRODUCT,但那不在你的问题中

您可以通过选择以下方式获取某些订单需要的路线:

 select case when :thresh > threshold then aboveThresholdRoute else belowThresholdRoute end
 from customer 
 where id = :customer_id

根据您拥有的任何公式以及订单客户计算阈值

答案 1 :(得分:0)

首先,already in production的架构似乎不够可扩展。但是,您的客户无需引用RouteRouteOrder的属性,而Order是客户的属性(通过Product关联)。

所以你需要创建一个新的Routes表,就像这样

CREATE TABLE Routes
(Id UNIQUEIDENTIFIER,
Name NVARCHAR(50));

然后改变Order表,如下所示:

ALTER TABLE Order ADD RouteId UNIQUEIDENTIFIER;
ALTER TABLE Order ADD CONSTRAINT FK_Routes_Id FOREIGN KEY (RouteId) REFERENCES Routes(Id);

然后,为用户选择路线:

SELECT * FROM Routes 
INNER JOIN Order 
ON 
    Routes.Id = Order.RouteId
INNER JOIN Product
ON
    Product.LastOrder = Order.Id -- Assuming that is the FK here, not clear from the question
INNER JOIN Customers
ON 
    Product.CustomerId = Customers.Id
WHERE 
    Customers.Id = 'some value here'

<强>更新 由于您现在提到的路由是特定于用户的,而不是特定于订单的,因此您可以像这样更改它:

CREATE TABLE Routes
(Id UNIQUEIDENTIFIER,
Name NVARCHAR(50));

然后像这样改变Customers表:

ALTER TABLE Customers ADD RouteId UNIQUEIDENTIFIER;
ALTER TABLE Customers ADD CONSTRAINT FK_Routes_Id FOREIGN KEY (RouteId) REFERENCES Routes(Id);

然后选择订单的路线,执行:

 SELECT * FROM Routes 
    INNER JOIN Customers 
    ON 
        Routes.Id = Customers.RouteId
    INNER JOIN Product
    ON
        Product.CustomerId = Customers.Id
    INNER JOIN Order
    ON 
        Product.LastOrder = Order.Id -- Assuming that is the FK here, not clear from the question
    WHERE 
        Order.Id = 'some value here'