SQL关系,一对多与当前使用的行

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和当前的价格,但如果我能在数据库中处理这个问题,对我来说似乎更好。如果不是,请告诉我 注意:我不认为这个确切的方法会起作用,因为我需要在我的项目表之前创建我的价格表,对于项目表也是如此。但这说明了我的问题 非常感

在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)