2009-08-04 4 views
0

드로잉 상점 신청서를 씁니다. 내 시스템에 이러한 수업이 있습니다 : 상점, 장바구니 장소, 랙 및 제과점.비슷한 개체 당 하나의 테이블?

가게 : X, Y, 이름, 폭, 길이, 종류, 용량

: X, Y는, 이름, 폭, 높이, 유형,

카트 장소를 해결

그들은이 특성을 가지고

랙 : X는 Y가, 이름, 폭, 길이, 유형, 나는 represe 싶습니다 이제

을 OPEN_HOURS : X, Y, 이름, 폭, 길이, 형태, 높이,

이 빵집 balance_limit 내 데이터베이스에 이러한 클래스를 입력하십시오. 위에서 볼 수 있듯이

X, Y, 너비, 높이, 이름 및 유형과 같은 것들을 볼 수 있습니다. 그리고 무엇이 그들을 다른 만드는 것은 :

가게 : 주소

카트 장소 : 용량

랙 : balance_limit

베이커리 : OPEN_HOURS

내가 아는 미래의 모든 종류의 객체의 그들 만의 새로운 재산을 갖게 될 것이고, 그들은 모두가 즉시 가질 새로운 재산을 얻게 될 것입니다.

그리고 상점, 장바구니, 랙 및 제과점과 같은 몇 가지 속성을 갖는 위에 언급되지 않은 새로운 유형의 개체가 있다는 것을 알고 있습니다.

새 속성과 새 개체를 추가 할 수있는 데이터베이스 구조를 만들고 싶습니다. 동시에 모든 클래스에 추가 될 새 속성을 추가 할 수 있습니다. 또한 시스템을 명확하게 설계하고 데이터베이스 쿼리를 쉽게 수행 할 수 있기를 바랍니다.

그래서 제 질문은 : 더 명확하기 때문에

내가 오브젝트 (쇼핑 카트 장소, 선반, 빵집) 모든 유형의 데이터베이스 테이블을해야하거나 내가 하나 개의 테이블에 모두 함께 결합한다 그들은 비슷한 속성 목록을 가지고 있기 때문에?

하나의 솔루션이 다른 솔루션보다 우수한 이유를 알려주시겠습니까? 나는 실용적인 조언을 얻기를 희망한다. "오직 올바른 방법 일 뿐이므로 공평하게해야한다."

답변

1

이것은 쉬운 질문이 아닙니다 ... SQL 데이터베이스는 클래스 계층 구조 모델링에 적합하지 않습니다.

좋은 ORM이 필요합니다.

먼저 나는 그것이 관련되어 있는지 확인 : 나는 테이블의 클래스 계층 구조를 넣어 무엇

수행이 있습니다 예를 들어, 같은 테이블에서 웹 CMS에 대한 등 노드, 기사, 퍼팅 감각 때문에한다 이들은 모두 똑같은 변형입니다.

검색, 인덱싱 및 SQL 쿼리를 만들기 위해 데이터베이스 열을 만들어야하지만 모든 정보를 데이터베이스 열에 저장할 필요가 없다는 아이디어가 있습니다. 나머지는 BLOB 컬럼의 직렬화 된 오브젝트에 저장할 수 있습니다.

표에는 - 물론이 열이 의 인스턴스 인 - 모든 클래스에 공통적 인 몇 가지 "핵심"열, 기본적으로 기본 클래스 필드를 나타내는 열이 있습니다. - 일부 하위 클래스에서만 사용되지만 검색을 위해 필요한 다른 열로 인덱싱해야합니다. - 개체의 다른 모든 데이터가 들어있는 BLOB입니다.

기본적으로 데이터베이스에 개체를 저장하면 해당 클래스에 따라 관련 열이 채워지고 나머지 데이터 (또는 전체 개체)가 BLOB에 밀어 넣어집니다.

위대한 점은 검색하거나 색인 할 필요가없고 저장 만하는 구성원 값을 데이터베이스 열에 추가 할 필요가 없으므로 변경하지 않아도된다는 것입니다. 데이타베이스는 직렬화 된 BLOB에 저장됩니다. 수행 할 수있는 유일한 작업은 deserialization 코드에이 멤버의 기본값을 추가하는 것입니다. 따라서 이미 데이터베이스에 있고이 멤버가없는이 클래스의 개체에는 괜찮은 기본값이 있습니다.

원하는 경우 개체 형식의 버전을 지정할 수도 있습니다. 더 복잡해집니다.

그러나이 방식은 몇 가지 단점이 있습니다

제약 조건을 적용하기 어려운 : - 당신은 단지 열이 분야에 제약 조건을 적용 할 수 있습니다. - 일부 열은 일부 클래스에서만 발생하기 때문에 데이터베이스는 클래스 계층 구조에 대해 조금 알고 있어야합니다.

예를 들어 주소를 별도의 테이블에 넣고 관련 필드 (우편 번호, 국가, 거리, 숫자 등)를 추가하는 것이 좋습니다. 주 테이블에이 모든 것을 넣으면 너무 많은 열이 추가됩니다. 또한 어떤 시점에서 다른 테이블에 있고 주소가있는 일부 고객 또는 다른 것을 추가하기를 원할 것입니다. 따라서 별도의 테이블에 주소를 넣고 참조하십시오. 사람이나 회사에 대한

같은 것 등

이제 가게 주소를 가지고 있지만 당신은 당신의 테이블에서 행에 참조해야 함을 데이터베이스 DDL에서 표현해야 할 것이다, 그래서 카트, 나는 가정하지 않는다 주소가 "shop"유형이지만 "cart"유형이 아닌 경우.

약간 털이 나올 수 있습니다.

예를 들어 10 개의 상점과 100,000 개의 카트가있는 경우 성능면에서 테이블을 분할하는 것이 재미있을 수 있으므로 멋진 작은 테이블과 큰 테이블을 얻을 수 있습니다.

예를 들어, 기본 클래스의 모든 코드와 기본 구성원을 추가하는 듯했으나 TABLENAME 파생 클래스에서 변경되는 클래스 속성을 만들 수 :


지금 다른 솔루션이 있습니다. 이런 방식으로, 테이블 이름을 바꾸는 것만으로 모든 코드가 다른 테이블에 적용되지만, 당신은 그것들을 재 작성할 필요가 없습니다.

그러면 클래스 당 1 개의 테이블이 생깁니다.

클래스 계층 구조가 복잡 해지면 위의 방법을 각 테이블에 적용 할 수 있습니다.


둘 중 어떻게 선택합니까? 기본적으로

당신은 웹 CMS를 만들 경우 당신은 노드에서 파생 된 클래스의 개체를 테이블에 저장 같은 : - 기사 - 등

이 모든 객체가 기본적으로 있습니다 - 갤러리 - 전설 와 이미지 같은 물건. 모두 Title, TextContent 필드가 ParentNode 등에 속합니다.

TextContent에서 "foo"에 대한 키워드 검색을 수행하면 모든 개체가 동일한 테이블에 있으면 훨씬 쉽습니다.

부모 노드의 모든 하위 목록을 웹 페이지에 표시하려면 모든 것이 1 개의 테이블에 있으면 훨씬 쉽습니다.

이 경우 첫 번째 방법은 실제로 이점입니다.

이제 귀하의 경우에는 객체가 비슷하지 않습니다.

Personnally 나는 그들에게 동일한 기본 클래스를주지 않을 것입니다. Mixing 이름을 "ThingWithCoordinates"(어쩌면 더 짧은 것)로 만들고 클래스에 추가합니다.

이제 베이커리는 상점에서 충분히 상속받을 수 있지만 카트와 랙은 아마 그렇지 않습니다.

귀하의 경우에는 분명히 여러 테이블을 사용합니다. 그리고 각 테이블에서 여러 클래스를 저장해야하는 경우 첫 번째 방법을 사용합니다.

가장 중요한 점은 클래스 계층 구조 (따라서 테이블)는 RELEVANT (자동차 딜러 및 빵집은 상점)를 기반으로해야하며 실제로 공통점이없는 객체 (예 : 장바구니 상점). 이를 위해 공통 코드를 공유하는 믹스지만 기본 클래스는 공유하지 않습니다.

0

예, 각 개체는 자체 개체이므로 하나의 테이블을 사용해야합니다. 이러한 테이블을 개체에 매핑하면 여러 테이블을 조인 할 필요가 없으므로 작업이 더욱 효율적입니다.

또한 각 개체는 개발 및 복잡성 측면에서 격리됩니다.

0

공통 항목에 대해 '공유'하면 어떤 이점이 있습니까?

그렇지 않은 경우, 다른 테이블에 고정하십시오 (특히 미래에 더 멀리 나올 경우).

ORM을 사용하지 않는 것 같습니까?

1

내가 제안하는 것 :

  1. 데이터베이스 문제에 대한 관련없이, 제대로 domain model 디자인합니다. 속성을 공유하는 엔티티 (예 : 이름이)는 어떤 식 으로든 관계가 있음을 의미하지 않습니다. 그들은 잘 될 수 있지만 ...
  2. 이 디자인을 잘 알려진 Object-Relational Structural Patterns (Database Design 참조)을 선택하여 데이터베이스 구조에 매핑하십시오.
  3. 올바른 ORM 솔루션을 사용하여 제품을 개발하십시오 (기본 데이터베이스 구조가 나중에 수정 될 수있는 솔루션이 바람직 함).
  4. 성능 문제가 발생하는 경우 (de)normalizing 데이터베이스를 사용하여 문제를 해결하십시오.
0

웹에서 "일반화 전문화 관계형 모델링"을 검색하십시오.

이 패턴이 발생할 때 SQL 데이터베이스를 디자인하는 방법에 대한 몇 가지 좋은 기사를 찾을 수 있습니다. 기사의 최고는 정식 규칙을 작성하기보다는 지침을 제공하는 기준을 따릅니다.

0

공통점이 shop_size와 비슷한 경우 별도의 테이블을 만드는 것이 좋습니다.

표준화를 통해 다른 정보를 얻을 수 있기 때문에 같은 측정 값을 가진 많은 상점이있을 수 있으므로 너비와 길이를 표시하는 드롭 다운을 쉽게 만들 수 있습니다.

나중에이 표에있는 데이터를보고 다른 정보를 얻을 수도 있습니다.

주로 유연성이 뛰어납니다.

관련 문제