2012-07-27 3 views
3

나는 내 웹 사이트에서 복권을 운영 할 것이므로 티켓과 번호를 저장할 어딘가에 있어야한다. 나는 tickets이라는 테이블을 가지고 있는데, 각 행은 자신의 티켓 아이디, 관련 로또 아이디 및 기타 모든 정보 (자신이 속한 사용자의 아이디와 같은)를 갖습니다.이 테이블과 행을 구성하는 가장 효율적인 방법은 무엇입니까? - MySQL

그러나 제 질문은 tickets에 다른 필드를 만들어 티켓에 선택된 번호를 유지해야하는지 여부입니다. 은 4 개의 번호를 선택하도록 요청할 수 있으며, lottery2은 6을 선택하도록 요청할 수 있으므로 number1, number2 등의 여러 입력란을 만들 수있는 옵션이 없습니다. 각 행은 그와 관련된 티켓 ID와 번호를했을 경우 또 다른 새로운 테이블 numbers라고 1,2,3,4,5,6 또는합니다

그래서 나는 즉 쉼표로 구분 된 티켓 번호를 받아 VARCHAR 또는 TEXT 중 하나 인 새 필드를 만들 수 있습니다. 그러나이 방법이 매우 효율적인지 확실하지 않습니다. 6 자리 숫자의 티켓 한 개만 있으면 tickets 테이블에 1 행, numbers 테이블에 6 행이 있어야합니다.

이러한 옵션 중 어느 것이 가장 효율적입니까? 아니면 이보다 더 좋은 방법이 있을까요? 복권 끝에서 코드는 각 티켓을 통해 그들이 이겼는지 확인해야 할 것입니다. 따라서 옵션 2가 너무 많은 리소스를 필요로 할 수 있습니다.

+0

숫자는 "티켓"의 속성입니다. 어떤 경우에는 티켓의 일부로 만드십시오. 간단한 CSV 또는 DSV 사용은 SSN 또는 전화 번호처럼 번호 자체가 엔티티 *이므로 자동으로 비정규 화되지 않아야합니다. lotto-numbers가'min, .., max'에 저장되면 간단한 * 정규 표현식과 인덱스 *를 사용할 수 있습니다. '하위 로트 번호'쿼리의 경우 "티켓 번호 N을 포함하는 티켓"은 다른 유스 케이스/문제입니다. –

+0

CSV 방식은 나에게 가장 효율적이고 쉬운 방법 인 것 같습니다. 그것을 얻으십시오. – David

+0

복권을 제공 할 지역 법률에주의하십시오. – David

답변

1

다음은 "Ticket [Number]"는 "을 선택하고 추첨 번호"을 의미합니다. Set(a,b,c)Set(c,b,a)과 같습니다.


I는 다음과 같이하여 할 것이다 : 예를 들어, 사용자가 그것을 선택으로 수가

이다
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 

그럼 그렇게 간단한 WHERE TicketNumber = @normalizedTicketNumber가 매우 빠른 인덱스 일 무슨 TicketNumber에 인덱스를 넣습니다.

나는 이것이 실질적으로 이고, 정규화 된 디자인은 TicketNumber (추첨 번호와 함께)가 Key를 형성한다고 주장한다.이에 대한 나의 주장은 따라서 다음과 같습니다

  1. TicketNumber 고유 (추첨 당) 티켓을 식별하는 불투명 값입니다. DB 모델 내부에서 "세부 사항을 알 필요가 없습니다". 경우에 따라서는 필요할 수도 있지만 여기에는 필요하지 않을 수 있습니다.

  2. DisplayTicketNumber는 사용자 입력의 이슈입니다. 아직 여러 DisplayTicketNumbers가 동일한 TicketNumber를 나타낼 수 있습니다. 이 가능 "복제"를 나타낼 않지만 선택 번호 (a 세트보다 더 많은 정보를 갖는다)를 목록를 나타내는 친숙한 표시 값을 이해하는 것이 중요하다. 이 내가 만들 것 같은 경우

    1. 생성 한 후, 어떤 데이터베이스 불일치가 여기에서 소개되지 수 있도록 트리거와 불변 DisplayTicketNumber (및 TicketNumber).

    2. FK를 계산할 수있는 경우 DisplayTicketNumber와 TicketNumber 사이의 제약 조건을 변경하지 않고 적용 할 수 있습니다.

은 (I는 I도 FK하는 TicketId 표시 등, 다른 플즈위한 다른 TicketNumbers을 갖는 같은 다양한 세부 사항을 생략했지만, I는 RaffleId,TicketNumber이 허용 [비 대리] 키임을 암시 .)

또한, 티켓 테이블 제거 될 : 여분의 관련 티켓 정보가없는 경우는 거의 복권 번호 설정은 다음이 허용 비정규 수 있습니다 제거, 그래서 공유 할 것이기 때문이다. 이 경우의 한 가지 이점은 TicketNumberPurchase 테이블로 이동 한 다음계산 열 (아직 색인화되어 있음)으로 바뀌어 Ticket 값을 정규화했다는 것입니다. MySQL이 관계 PK(Ticket.TicketNumber) 사용 후 FK에서 계산 된 열을 이용하여 허용 경우

그리고 - Purchase.TicketNumber가 계산>FK(Purchase.TicketNumber)는, 티켓 테이블을 제거하지 않고 모델의 무결성을 높이기 위해 사용될 수있다. (그러나 MySQL을 사용하지 않으므로 실행 가능 여부는 말할 수 없습니다.)

해피 코딩.

0

숫자라고하는 새 테이블을 만들 때 두 번째 옵션을 사용하고 관련 번호가 있습니다.

하지만 티켓 표에 필드를 추가하여 선택할 수있는 숫자의 양과 해당 티켓을 사용하여 삽입 된 숫자의 양을 확인하는 조건을 쿼리에 COUNT를 사용하여 추가합니다)가 선택할 수있는 숫자의 양보다 적 으면 삽입하십시오.

관련 문제