2010-05-14 87 views
0

我在我的數據庫中有一個表Car,其中一列是purchaseDate。我希望能夠通過一系列政策來標記每輛車(限制爲10項政策)。每項政策都有一定的時間(ttl,持續時間,如「5年」,「10個月」等),也就是說,自汽車購買日期起,該政策可以適用多久。如何在數據庫模式中設計這種關係

我需要執行以下操作:

  • 插入汽車的時候,它會與一些政策(至少一個設置)
  • 有時車將更新,增加了集/刪除策略
  • 搜索必須做到兼顧日期/政策,例如:「選擇並不受任何政策從今天開始所有的車」

我現在的設計是(pol0 .. pol9是的政策):

CREATE TABLE Car (
id int NOT NULL IDENTITY(1,1), 
purchaseDate datetime NOT NULL, 
//more stuff... 
pol0 smallint default NULL, 
pol1 smallint default NULL, 
pol2 smallint default NULL, 
pol3 smallint default NULL, 
pol4 smallint default NULL, 
pol5 smallint default NULL, 
pol6 smallint default NULL, 
pol7 smallint default NULL, 
pol8 smallint default NULL, 
pol9 smallint default NULL, 
PRIMARY KEY (id) 
) 

CREATE TABLE Policy (
id smallint NOT NULL, 
name varchar(50) collate Latin1_General_BIN NOT NULL, 
ttl varchar(100) collate Latin1_General_BIN NOT NULL, 
PRIMARY KEY (id) 
) 

我面臨的問題是執行上述查詢的SQL是一個噩夢寫。 因爲我不知道每個政策的哪一欄可以是,所以我必須檢查每個政策的所有列等等。所以我想知道這是值得改變的。我的問題是:

  1. 的SMALLINT作爲策略ID被選擇,而不是一個「詮釋身份」爲了節省,因爲將是數以百萬計的汽車記錄一些空間。它只是增加了創建策略時的複雜性,因爲我們必須處理id等。值得這樣做嗎?

  2. 我在想,也許有更好的設計?顯然,我們可以移動的策略/車關係到它自己的表CarPolicy,好處是:

    • 每車10個政策
    • 添加/刪除等更容易沒有限制
    • 當只有默認策略應用(當沒有人應用其中一個叫做默認策略時),我們可以通過在CarPolicy中沒有任何條目來表示信號,現在只需在其中一列中插入默認策略ID。

    缺點是我們需要更改數據庫,ORM類等。您會推薦什麼?

  3. 也許有另一種聰明的方式來實現這一點,我們不知道沒有使用CarPolicy表?

回答

4
  1. 這是一個漫長的時間,因爲它是值得使用SMALLINT節省空間;在這樣做的過程中,你不會看到任何顯着的性能差異,這隻會造成潛在的麻煩。

  2. 出於您列出的原因,單獨的CarPolicy表格絕對是正確的方法。做出改變需要付出一定的時間,但一旦完成,它就會完成,而且它會爲保存的麻煩多次付出代價。

+0

+1我的話剛好輸入得更快:) – 2010-05-14 16:13:36

+0

和我的。任何時候你開始有這樣的列,它會讓你瘋狂。無論如何這並不是那麼高效。 – 2010-05-14 16:27:29

+0

好的,選擇這個,這是我從一開始就想到的,但不知道我是否能夠實際實現它。必須考慮如何升級與數百萬行的現有安裝... – Persimmonium 2010-05-14 21:50:13

0

我會建議給它的關係它是自己的表,包含一個車號和一個政策ID。

0

我會建議改變它,以便你有一個政策表,其中有汽車Id。因此,不是鏈接到Car表格中的一組策略,而是鏈接到Policies表格中的單個Car。然後,您將包含一個TTL列和一個狀態列,以便它們可以過期,並且您可以使用政策表中的車輛識別號進行查詢。

只要每個政策只能有一輛汽車,並且每個政策只有一輛汽車(誰擁有沒有汽車的政策,對吧?),那麼這是一個很好的方法。

更新:啊,我誤讀了。如果是多對多的話,就像其他人所說的那樣做CarPolicy表。

+0

我敢肯定,Policy.id是一個政策*類型* - 有<256可能的ID - 所以這看起來像一個多對-many(Cars-to-Policies)案例。 – egrunin 2010-05-14 20:47:30

+0

是的,這就像egrunin解釋... – Persimmonium 2010-05-14 21:49:03