2011-03-06 78 views
0

我正在研究跟蹤特定項目價格的應用程序。這是一個很好的解決方案,可確保在這種特定情況下的數據完整性?

每個價格都有一個物品的參考,銷售該物品的企業以及該物品的銷售地點。現在,通常情況下,這會做的很好:

CREATE TABLE `price` (
    `priceId` INT UNSIGNED NOT NULL AUTO_INCREMENT, -- PK 
    `businessId` INT UNSIGNED NOT NULL, 
    `itemId` INT UNSIGNED NOT NULL, 
    `locationId` INT UNSIGNED NOT NULL, 
    `figure` DECIMAL(19,2) UNSIGNED NOT NULL, 
    -- ... 
) 

但我有以下問題:

應用邏輯是這樣的,在一個位置一個企業一個項目可以有多個價格(在這一點上這並不重要),其中一個價格可以是是一個官方價格 - 一個物品不一定要有官方價格,但如果是這樣,則只能有一個。

問題是;如何對此進行建模以確保數據完整性?


我最初的想法是創建一個額外的表:

CREATE TABLE `official_price` (
    `priceId` INT UNSIGNED NOT NULL -- PK + FK (references price.priceId), 
    -- ... 
) 

此表將舉行priceId:s表示價格是官方的,並且PK/UNIQUE約束會照顧「之一或「無」約束。

這似乎是一個可行的解決方案,但我仍然想知道是否有更好的方法來處理這種情況?

回答

0

你可以使用這個骯髒的黑客:

  1. 一個字段添加is_officialprice表,空爲值可能在它
  2. 創建一個獨特的複合指數priceId + is_official
  3. 作的官方價格把1is_official
  4. 因爲沒有官方留下它是null
+0

謝謝,我也考慮過這個。 (priceId + is_official)不起作用,因爲一個項目可以有多個價格,但是這個黑客可以使用一個唯一的組合索引(businessId + itemId + locationId + is_official)。 –

+0

@Martin:哎呀,是的,錯過了一點。主要想法是'nulls'不被視爲重複。 – zerkms

0

你可以使price表持有唯一的官方價格(與圖可能爲null),穿上(businessIditemIdlocationId)唯一約束,並添加輔助價格參考priceId的另一個表。

相關問題