2012-07-27 47 views
3

我將在我的網站上運行彩票,因此需要在某處存儲票據和號碼。我肯定會有一張牌,名爲tickets,其中每一行都有自己的門票ID,其關聯的彩票ID和所有其他信息(如所屬用戶的ID)。組織這些表格+行的最有效方法是什麼? - MySQL

但是,我的問題是,我是否應該在tickets中設置另一個字段來存儲在故障單上選擇的號碼。由於每張彩票都有不同類型的彩票(即lottery1可能會要求您選擇4個號碼,並且lottery2可能會要求您選擇6),因此創建多個字段(如number1,number2等)不是一種選擇。

所以我可以做一個新的領域要麼是VARCHAR或TEXT接受逗號分隔的票號,即:1,2,3,4,5,6或進行另一個新的表稱爲numbers,其中每一行必須與它相關聯票和號碼。不過,我不確定這種方法是否非常有效,因爲只有一張6位數的票,tickets表中需要有1行,numbers表中有6行。

以下哪個選項最爲有效?還是有更好的辦法來做到這一點?請記住,在抽獎結束時,代碼需要遍歷每張票以檢查他們是否贏了 - 所以選項2可能會佔用太多資源。

+0

數字「是一張票的財產,不是嗎?在這種情況下,將其作爲票證的一部分。使用簡單的CSV或DSV不應自動*被視爲非規範化,因爲號碼本身*是實體*,就像SSN或電話號碼一樣。如果樂透號碼被存儲爲「min,..,max」,則可以使用簡單的*常規等式和索引*。對於「子樂透號碼」查詢,例如「包含數字N的票據」,那麼這就是另一個用例/問題。 – 2012-07-27 00:09:59

+0

對我來說,CSV方法似乎是最高效和最簡單的方法,因爲您可以一旦「爆炸()」數據得到它。 – David 2012-07-27 00:16:13

+0

爲了什麼是值得的,請謹慎遵守當地的法律,您將在那裏進行抽獎。 – David 2012-07-27 00:16:45

回答

1

在下面的「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(以及說抽獎號碼)形成一個關鍵。我此參數是這樣的:

  1. 甲TicketNumber是不透明值唯一標識(每獎券)的票據。人們不需要在數據庫模型中「知道細節」。 (可能在某些情況下需要,但在這裏不需要)

  2. DisplayTicketNumber是用戶輸入的工件;但多個DisplayTicketNumbers可以表示相同的TicketNumber。雖然這確實表示可能的「複製」是要認識到這是一個友好的顯示值,該值代表一個列表(其具有更多信息比設置)選擇號碼是重要的。

    1. 在這樣我會做一個情況下,DisplayTicketNumber(和TicketNumber)不變以使,創建後,沒有數據庫不一致可能在這裏介紹的觸發器。

    2. 如果可以計算FK,那麼DisplayTicketNumber和TicketNumber之間的約束可以在沒有不可變性的情況下執行。

(I省略各種細節等具有用於不同萊佛士不同TicketNumbers等我還示出了TicketId用於FK,但我也暗示RaffleId,TicketNumber是可接受的[非替代]鍵。)

此外,票務表可能被淘汰:因爲很少有彩民套數將被共享的話,如果沒有額外的相關票務信息,然後刪除它可能是一個接受非規範化。這樣做的一個優點是,TicketNumber可以被移動到Purchase表格中,然後變成計算列(它仍然被編入索引),其將票據值標準化。

而且,如果 MySQL允許在FK使用計算列然後使用下面的關係PK(Ticket.TicketNumber) - >FK(Purchase.TicketNumber),其中Purchase.TicketNumber被計算,可以被用來增加模型的完整性而不消除票務表。 (然而,我不使用MySQL,所以我不能說這是否可行。)

快樂編碼。

0

我會使用第二個選項來創建新表,稱爲數字,並且您有與其關聯的數字。

但我還要在票據表中添加一個字段,指明可以選擇的數字數量,以及檢查使用該票證插入的號碼數量(在查詢中使用COUNT )小於可以選擇的數字的數量,然後插入。

相關問題