我正在尝试修改C#.NET MVC Web应用程序和现有数据库以实现一些新功能。但是,尽量尝试,我不能修改数据库结构而不创建循环引用,我希望有人可能有解决方案。
我想实现一种订单路由方法。因此,根据客户设置的阈值,订单将根据订单大小以两种方式之一生成。所以我发现当我设计数据库时,客户需要引用路由表,因为它决定了订单何时应该到达的位置。此外,由于订单附加到路线,它还需要引用路由表,从而产生循环引用:
客户,产品和订单已经投入生产,因此如果需要,我会担心修改这些关系。
非常感谢任何帮助! 提前谢谢。
答案 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
的架构似乎不够可扩展。但是,您的客户无需引用Route
。 Route
是Order
的属性,而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'