在下面的「Ticket [Number]」中應該表示「選擇Set彩票號碼」。請記住,Set(a,b,c)
等於Set(c,b,a)
。
我將有它是這樣的:
Purchase
-PersonID // associate Person (one person can have many purchases)
-TicketID // associate Ticket (a purchase is for one "ticket",
// which can be purchased many times)
-DisplayTicketNumber // for Human Display
Ticket
-TicketNumber
即,Purchase:M-1:Ticket
的DisplayTicketNumber
是多少,當用戶選擇它,例如「3,1,2」,而另一方面,TicketNumber
是標準化的票號,其中小值被放在第一位。最終形式是min,..,max
或類似的。也就是說,任何數量的DisplayTicketNumbers
具有相同的一組值(以任意順序)將具有相同TicketNumber
:
DisplayTicketNumber TicketNumber
1,2,3 1,2,3
2,3,1 1,2,3
3,2,1 1,2,3
3,2,1,4 1,2,3,4 .. and etc
然後穿上TicketNumber
指數等什麼簡單的WHERE TicketNumber = @normalizedTicketNumber
將是一個非常快的指數。
我實際上會認爲這是一個可接受標準化設計和TicketNumber(以及說抽獎號碼)形成一個關鍵。我此參數是這樣的:
甲TicketNumber是不透明值唯一標識(每獎券)的票據。人們不需要在數據庫模型中「知道細節」。 (可能在某些情況下需要,但在這裏不需要)
DisplayTicketNumber是用戶輸入的工件;但多個DisplayTicketNumbers可以表示相同的TicketNumber。雖然這確實表示可能的「複製」是要認識到這是一個友好的顯示值,該值代表一個列表(其具有更多信息比設置)選擇號碼是重要的。
在這樣我會做一個情況下,DisplayTicketNumber
(和TicketNumber
)不變以使,創建後,沒有數據庫不一致可能在這裏介紹的觸發器。
如果可以計算FK,那麼DisplayTicketNumber和TicketNumber之間的約束可以在沒有不可變性的情況下執行。
(I省略各種細節等具有用於不同萊佛士不同TicketNumbers等我還示出了TicketId
用於FK,但我也暗示RaffleId,TicketNumber
是可接受的[非替代]鍵。)
此外,票務表可能被淘汰:因爲很少有彩民套數將被共享的話,如果沒有額外的相關票務信息,然後刪除它可能是一個接受非規範化。這樣做的一個優點是,TicketNumber
可以被移動到Purchase
表格中,然後變成計算列(它仍然被編入索引),其將票據值標準化。
而且,如果 MySQL允許在FK使用計算列然後使用下面的關係PK(Ticket.TicketNumber)
- >FK(Purchase.TicketNumber)
,其中Purchase.TicketNumber
被計算,可以被用來增加模型的完整性而不消除票務表。 (然而,我不使用MySQL,所以我不能說這是否可行。)
快樂編碼。
數字「是一張票的財產,不是嗎?在這種情況下,將其作爲票證的一部分。使用簡單的CSV或DSV不應自動*被視爲非規範化,因爲號碼本身*是實體*,就像SSN或電話號碼一樣。如果樂透號碼被存儲爲「min,..,max」,則可以使用簡單的*常規等式和索引*。對於「子樂透號碼」查詢,例如「包含數字N的票據」,那麼這就是另一個用例/問題。 – 2012-07-27 00:09:59
對我來說,CSV方法似乎是最高效和最簡單的方法,因爲您可以一旦「爆炸()」數據得到它。 – David 2012-07-27 00:16:13
爲了什麼是值得的,請謹慎遵守當地的法律,您將在那裏進行抽獎。 – David 2012-07-27 00:16:45