4

[전 표제 : 태그 기반 조직 방법론에 관계 구조를 강제하는 방법이 있습니까?]태그 기반 조직에서 구조를 정의하는 방법은 무엇입니까?

나는 몇몇 엔티티가 있으며 일련의 속성을 가지고 있습니다. 속성 중 일부는 엔티티가 가질 수있는 다른 속성에 영향을 미치고 많은 속성은 그룹으로 구성되며 경우에 따라 엔티티에는 특정 그룹의 특정 속성 수 또는 특정 그룹의 속성 범위가 필요할 수 있습니다.

데이터베이스를 사용하는 요구 사항, 그룹화, 제외 등과 같은 이러한 종류의 태그 - 태그 관계를 모델링하는 방법이 있습니까? 아니면 프로그래밍 된 "비즈니스 규칙"에서만 가능합니까? 이상적으로는 가능한 태그와 그 관계를 쉽게 구성 할 수 있으므로 매우 유연합니다.

내가 고려한 방법 중 하나는 태그와 가능한 관계를 갖는 것입니다. 그런 다음 태그 태그로 적용된 관계 종류의 테이블을 얻습니다. 그러나 이는 다소 취약한 접근 방법처럼 보입니다.

이렇게하면 더 엄격한 방식으로 가능하며, 그렇다면 어떻게 시작할 것인가?

답변

4

편집 : 다른 속성의 값에 따라 적용되는 변수 속성에 대한 설명은 비 관계형이며 비 정규화 된 디자인입니다. RDBMS는 이러한 종류의 데이터를 저장하는 최상의 솔루션이 아닐 수도 있습니다. 아마도 RDF는 이러한 유연성 수준을 요구하는 데이터를위한 좋은 솔루션이 될 것입니다. Entity-Attribute-Value 디자인


어떤 사람들 모델 유연한 특성, 그러나 이것은 종종 너무 구조화 그리고 당신은 데이터 무결성 문제와 싸우고 결국 :

내 이전 대답은 RDBMS 솔루션에 관한, 다음과 같습니다. 사실상 무한한 수의 엔티티 하위 유형이 필요한 경우에만 이것을 사용하십시오.

다른 사람들은 모든 하위 유형에 사용 된 모든 속성 열을 하나의 매우 넓은 테이블에 넣고 그 속성이 하위 유형과 관련이없는 행에 NULL을 남겨 두는 Single Table Inheritance을 사용합니다. 그러나 테이블이 너무 커질 수 있고 모든 속성을 필수로 만들 수 없기 때문에이 제한이 있습니다. 왜냐하면 모두 null을 허용해야하기 때문입니다.

상대적으로 적은 수의 엔티티 하위 유형이있는 경우 필수 속성의 각 그룹에 대해 종속 테이블을 만드는 것이 좋습니다. 종속 테이블의 기본 키를 상위 테이블에 대한 외래 키로 정의하여 일대일 관계를 얻습니다.

상위 테이블의 기본 키에 하위 유형을 인코딩하여 데이터 무결성을 조금 더 제공 할 수도 있습니다. Automobiles의 행이 Vehicles에 오토바이를 참조 할 수 없도록해야합니다.

CREATE TABLE Vehicles (
    vehicle_id INT, 
    vehicle_type VARCHAR(10), 
    ...attributes common to all vehicles... 
    PRIMARY KEY (vehicle_id, vehicle_type), 
    FOREIGN KEY (vehicle_type) REFERENCES VehicleTypes (vehicle_type) 
); 

CREATE TABLE Automobiles (
    vehicle_id INT, 
    vehicle_type VARCHAR(10) CHECK (vehicle_type = 'Automobile'), 
    ...attributes specific to autos... 
    FOREIGN KEY (vehicle_id, vehicle_type) 
    REFERENCES Vehicles(vehicle_id, vehicle_type) 
); 

은 물론, 새 종속 테이블을 새 하위 유형을 정의 할 때마다 작성해야하지만,이 디자인 등등 데이터 무결성, NULL NOT 속성을 적용 할 많은 당신에게 더 많은 구조를 준다, 그리고 .

= '자동차'인 Vehicles의 각 행에 Automobiles 행을 만들어야한다는 점만 애플리케이션 논리에서 적용해야합니다.

2

데이터베이스를 사용하여 규칙을 적용하거나 소스 코드를 다른 곳에서 사용하는 것과는 차이가 없습니다. 코드는 데이터입니다. 그것은 비의 Lisp 대답입니다.

당신이 묻는 진짜 질문은 이것이 관계형 데이터베이스에서나 알골 (Algol) 가정 언어에서 더 쉬울 것인지입니다. RDBMS를 지정하지 않으므로 ANSI로 가정합니다. 그것은 이것을 어렵게 만든다.

알아두기, 이것은 Prolog에서 쉽습니다. 그러나 그것은 여기도 거기에 없습니다.

모든 것에 대해 check 제약 조건을 사용한다고 말할 수 있습니다. 이 접근법에 필요한 정신적 변화는 UI에 이러한 태그 관계를 정의하는 방법이 필요하다는 것을 인식하는 것입니다. 전통적으로 UI에서 CRUD 문을 DB로 발행합니다. 대신, CRUD 점검 제한 조건에 대해 ALTER TABLE.을 _ 행해야합니다.

  • 이러한 진술은 대부분의 RDBMS 년대 파라미터 화되지 않습니다

    이 방법으로 두 가지 문제가 있습니다. SQL 인젝션을 생각해보십시오.

  • 구현은 전체 ANSI 검사 제약 조건에 대한 지원이 다양합니다. 하위 쿼리가 지원되지 않는 경우 잊어 버리십시오.

특정 RDBMS로 질문을 명확히 할 수 있다면 더 나은 답변을 드릴 수 있습니다.