我在我的數據庫中有一個表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是一個噩夢寫。 因爲我不知道每個政策的哪一欄可以是,所以我必須檢查每個政策的所有列等等。所以我想知道這是值得改變的。我的問題是:
的SMALLINT作爲策略ID被選擇,而不是一個「詮釋身份」爲了節省,因爲將是數以百萬計的汽車記錄一些空間。它只是增加了創建策略時的複雜性,因爲我們必須處理id等。值得這樣做嗎?
我在想,也許有更好的設計?顯然,我們可以移動的策略/車關係到它自己的表CarPolicy,好處是:
- 每車10個政策
- 添加/刪除等更容易沒有限制
- 當只有默認策略應用(當沒有人應用其中一個叫做默認策略時),我們可以通過在CarPolicy中沒有任何條目來表示信號,現在只需在其中一列中插入默認策略ID。
缺點是我們需要更改數據庫,ORM類等。您會推薦什麼?
也許有另一種聰明的方式來實現這一點,我們不知道沒有使用CarPolicy表?
+1我的話剛好輸入得更快:) – 2010-05-14 16:13:36
和我的。任何時候你開始有這樣的列,它會讓你瘋狂。無論如何這並不是那麼高效。 – 2010-05-14 16:27:29
好的,選擇這個,這是我從一開始就想到的,但不知道我是否能夠實際實現它。必須考慮如何升級與數百萬行的現有安裝... – Persimmonium 2010-05-14 21:50:13