SQL关系,一对多与当前使用的行
在sql中,我有一个项目表。一个项目可以有多个价格。但是当我开始使用数据时,大多数时候我只需要我能找到的日期的当前价格 我的问题是:在价格上有2个关系是不对的,其中和项目与当前价格和所有价格都有关系。在我的mvc中,是否有一种解决此类问题的方法来防止复杂性。我目前使用的viewModel和当前的价格,但如果我能在数据库中处理这个问题,对我来说似乎更好。如果不是,请告诉我 注意:我不认为这个确切的方法会起作用,因为我需要在我的项目表之前创建我的价格表,对于项目表也是如此。但这说明了我的问题 非常感谢你的帮助SQL关系,一对多与当前使用的行,sql,asp.net-mvc-4,entity-framework-5,foreign-key-relationship,table-relationships,Sql,Asp.net Mvc 4,Entity Framework 5,Foreign Key Relationship,Table Relationships,在sql中,我有一个项目表。一个项目可以有多个价格。但是当我开始使用数据时,大多数时候我只需要我能找到的日期的当前价格 我的问题是:在价格上有2个关系是不对的,其中和项目与当前价格和所有价格都有关系。在我的mvc中,是否有一种解决此类问题的方法来防止复杂性。我目前使用的viewModel和当前的价格,但如果我能在数据库中处理这个问题,对我来说似乎更好。如果不是,请告诉我 注意:我不认为这个确切的方法会起作用,因为我需要在我的项目表之前创建我的价格表,对于项目表也是如此。但这说明了我的问题 非常感
CREATE TABLE Item.Items
(
ItemId INT NOT NULL
CONSTRAINT PK_Items_ItemId
PRIMARY KEY
IDENTITY,
--------------------------------------------------
--CurrentPriceId INT NOT NULL
CONSTRAINT FK_Prices_Items
FOREIGN KEY REFERENCES Item.Items (ItemId),
--------------------------------------------------
Name VARCHAR(100) NOT NULL,
Points INT NOT NULL DEFAULT 0,
Description VARCHAR(5000) NULL
)
CREATE TABLE Item.Prices
(
PriceId INT NOT NULL
CONSTRAINT PK_ItemPrices_ItemPriceId
PRIMARY KEY
IDENTITY,
ItemId INT NOT NULL
CONSTRAINT FK_ItemPrices_Item
FOREIGN KEY REFERENCES Item.Items (ItemId),
EffectiveDate DATETIME NOT NULL,
Value MONEY NOT NULL
)
最好是:
CREATE TABLE Item.Items
(
ItemId INT NOT NULL
CONSTRAINT PK_Items_ItemId
PRIMARY KEY IDENTITY,
--------------------------------------------------
CurrentPrice MONEY NOT NULL, -- optional optimization, redundant as
-- current price is available from item.Prices
--------------------------------------------------
Name VARCHAR(100) NOT NULL,
Points INT NOT NULL DEFAULT 0,
Description VARCHAR(5000) NULL
)
CREATE TABLE Item.Prices
(
ItemId INT NOT NULL
CONSTRAINT FK_ItemPrices_Item
FOREIGN KEY REFERENCES Item.Items (ItemId),
EffectiveUtc DATETIME NOT NULL,
Price MONEY NOT NULL,
Constraint [ItemPricesPK] PRIMARY KEY CLUSTERED
(
[ItemId] ASC,
[EffectiveUtc] ASC
)
)
正如@popovitz所提到的,您总是可以使用相关子查询获取任何特定日期的价格
Select i.name, p.price
From Item.Items i
Join Item.Prices p
ON i.ItemId = p.ItemId
Where p.EffectiveUtc =
(Select Max(EffectiveUtc )
From Item.Prices
Where ItemId = i.ItemId
And EffectiveUtc <= @asOfDate)
我不建议添加currentPrice列,因为您必须不断确保每当新价格生效时,item表都会更新。当您有一个包含带有EffectiveDate列的价格的表时,查询当前价格并不难:
这将为当前系统时间选择正确的价格,假设EffectiveDate,ItemId对于表prices是唯一的。我不确定聚集索引有什么帮助。除了检索currentPrice之外,它还有其他用途吗?因为它将按日期排序?按此顺序对itemId和生效日期上的索引进行聚类,可以确保任何单个项目的记录在磁盘上彼此相邻,因为它们实际上是物理存储的。这意味着查询处理器更有可能在单个I/o页面上找到该项的所有记录。更确切地说,它将在更少的I/O页面上找到所有记录。这大大减少了所需的磁盘I/O数量,并提高了磁盘I/O性能。好的,非常感谢,这意味着我一开始没有做错什么,我将把它添加到我的查询中,我将研究更多关于I/O页面的信息,这是我第一次看到它。谢谢你的回复,那很好,这就是我用实体框架查询数据时所做的。
SELECT i.name, p.price FROM Items i
INNER JOIN Prices p ON i.ItemId = p.ItemId
WHERE p.EffectiveDate =
(SELECT MAX(EffectiveDate) FROM Price
WHERE EffectiveDate <= SYSDATE
AND ItemId = i.ItemId)