2011-12-18 7 views
0

나는 곧 구현할 MySQL 데이터베이스의 대략적인 디자인을 가지고 있지만 기술적으로 정확한지 확신 할 수 없습니다. 나는 내 마음에, 데이터베이스 설계에 따라서 의심 정규 교육을 찍은 적이 없다 :MySQL 데이터베이스 디자인

엔티티/테이블

  1. 상품 (P_ID, 이름)
  2. 패키지 (P) ID, 이름)
  3. Default_Package (* Commodity_ID * package_id와, P_ID)
  4. Custom_Package (* Commodity_ID * package_id와, Order_ID라고, P_ID)
  5. 오더 (P_ID, package_id와, Custom_Package = 0)

이 기본적으로 시스템이 작동하도록 설계하는 방법입니다 :

  • 사용자는 기본 패키지를 구매해야

    1. 관리자는 default_package 테이블에 저장된 기본 패키지의 무리를 만들 Order_ID 테이블의 Package_ID 필드에서 참조됩니다.
    2. 사용자는 기본 패키지를 사용자 정의 할 수 있습니다. 그들이 그렇게 선택하면 Custom_Package 필드는 1로 flicked되고 Custom 패키지의 정보는 Custom_Package 테이블에 저장됩니다.

    3. 조회를 수행 할 때 orders 테이블의 custom_package 필드가 점검됩니다. 0 인 경우 패키지는 default_package 목록에서 검색되고 그 다음에는 주문을 다시 참조하는 모든 레코드를 검색하여 Custom_Package 목록에서 패키지를 검색합니다.

    데이터베이스 설계 및 구현에 대한 필자의 경험에 비추어 볼 때이 방법이 효과적입니다. 그러나 이것이 최선의 방법인지 확실하지 않습니다.

    누군가가 의견을 나눌 수 있다면 정말 감사하겠습니다.

    :

  • +0

    을 모두 설계를 사용하여 쿼리를 작성 시도하고 하나가 쉽게 확인할 패키지의 유형. 또한 패키지 ID가 고유 한 경우 (즉, 모든 패키지에 고유 한 이름이있는 경우)이 디자인을 기반으로 패키지에 자체 테이블이 필요한 이유가 표시되지 않습니다. – Sparky

    +0

    패키지 테이블을 제거하면 반복적 인 데이터 세트를 자신의 테이블에 배치하도록 요구하는 정규화 규칙 패키지는 하나 이상의 필수품으로 구성됩니다. 따라서 여러 상품이있는 패키지의 경우 각 상품 ID에 대해 패키지 이름이 반복됩니다. 사용자 정의 패키지와 기본 패키지를 하나의 테이블로 옮기는 경우 기본 패키지를 검색 할 때마다 WHERE 절을 포함시켜야하는 방법을 고려하여 약간의 시간을 들여야합니다. 하나의 여분의 테이블은 실제로 상처를 입혀서는 안됩니다. – captainspi

    +0

    예를 들어, 상품 표가 분리되어야한다는 것에 동의합니다. 귀하의 응답을 기반으로, 나는 패키지가 작은 이름 집합이라고 가정하므로 같은 테이블에 있어서는 안됩니다 (반복을 방지하기 위해). – Sparky

    답변

    0

    내 생각, 당신의 예제와 댓글 :

    그것은 당신의 "패키지"를 표시 패키지 이름과 상품 이름의 조합은?

    1. 상품 (P_ID, 이름)
    2. 패키지 (P) ID, 이름)

    내가 아래 두 개의 테이블이 결합 된 것입니다 :

    3. Default_Package (* Commodity_ID, * Package_ID, P_ID) 
    4. Custom_Package (* Commodity_ID, * Package_ID, Order_ID, P_ID) 
    

    3. Packages (P_ID, * Commodity_ID, * Package_ID, P_type=0/1) 
    
    당신이 얻을하려고 할 때 불필요하게 복잡 할 절을 가입하기 때문에이 주문 테이블에 플래그를시키는 권하고 싶지 않다

    4. Order (P_ID, Package_ID) 
    

    에서개

    다음 장소 주문, 그것은 검색해야하는 "패키지"테이블을 결정 모든 주문에 대한 패키지 세부 정보.

    당신은 내가 단일 비트 (개인 취향)에 대한 비정규의 비트를 받아 들일 있지만까지 정상화로, 당신은 또한, 별도의 테이블에 패키지p_type을 깰 수있는 엄격하고 싶다면 . 그러나 패키지에 고유 한 다른 필드가있는 경우 ID 및 기타 필드가있는 패키지 테이블을 만들고 commodity Id 및 Package Id의 목록이있는 packages_details 테이블을 만듭니다. 사용자 정의 패키지 대 기본 패키지 (예 : 기본 패키지가 1 ~ 100이고 사용자 정의가 그 다음에 시작됨)에 대한 숫자 체계를 사용하지 마십시오. 그와 같은 스키마는 앞으로 중단 될 가능성이 매우 높기 때문에 (회사가 성장하고 내가 제안 무엇 예를 들어 100 개 기본 패키지)

    보다, 아마 당신이 필요합니다 "가장 상세」를 나타냅니다 모든 주문에 대한 모든 패키지의 세부 정보를 검색하기 위해 함께 쿼리를 배치됩니다. 그들이 다를 수하는 몇 가지 이유가없는 나는 나타내는 필드로, 하나 개의 테이블에 함께 기본 패키지 및 사용자 정의 패키지를 둘 것, ...

    +0

    두 패키지 모두에 대해 하나의 테이블을 사용하는 것이 초기 계획 이었음을 인정해야합니다. 그러나 커스터마이징 된 공통 패키지 유형에 대해 여러 주문을 할 가능성이 있음을 알았을 때 그 계획을 폐기해야했습니다. 패키지 테이블에서 order_Id 외래 키를 제외하면 주문과 사용자 정의 패키지 간의 연결이 끊어집니다. 여러 사용자가 패키지 3을 주문하고이를 사용자 정의한다고 가정하면 세 개의 사용자 정의 주문 중 어느 것이 3 개의 사용자 정의 패키지 중 어느 것과 연관되는지 식별 할 수있는 방법이 없습니다. – captainspi

    +0

    사용자가 사용자 정의 패키지를 주문하면 테이블에 자체 ID가 있어야합니다.기본 패키지 유형 (상품 및 패키지 목록)을 주문하면 사용자 정의 패키지가 아닌 다른 것을 어떻게 얻을 수 있습니까? – Sparky

    +0

    아, 무슨 뜻인지 알 것 같습니다. 패키지 테이블에 사용자 정의 패키지의 새 레코드를 채우고 사용자 정의 패키지를 사용자 정의 패키지 ID와 연관 시키길 원합니다. 그것은 직관적 인 의미를 갖습니다. 나는 그것을 간과했다고 믿을 수 없다. 감사합니다 Sparky :) 추신 : 나는 이상한 이유로 패키지 테이블에 사용자 정의 패키지의 새 인스턴스를 추가하지 않고 사용자 정의 상품을 기본 패키지 ID와 연관 시키려고했습니다. 나는 두뇌가 퇴색했다고 생각했다. 정말 고맙습니다! – captainspi