문제

이전 제목 : 태그 기반 조직 방법론에서 관계 구조를 강요하는 방법이 있습니까?

나는 일부 엔티티가 있고 일련의 속성이 있습니다. 속성 중 일부는 엔터티가 가질 수있는 다른 속성에 영향을 미치고, 많은 속성이 그룹으로 구성되며, 때로는 엔티티가 특정 그룹의 특정 속성 또는 특정 그룹의 속성 범위를 갖도록 요구됩니다.

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

내가 고려한 방법 중 하나는 태그와 가능한 관계를 갖는 것입니다. 그런 다음 태그 태그에 적용되는 관계를 얻는 것이지만, 이것은 다소 부서지기 쉬운 접근 방식처럼 보입니다.

그렇다면 이것이 더 엄격한 방식으로 가능합니까? 그렇다면 어떻게하기 시작합니까?

도움이 되었습니까?

해결책

편집하다: 다른 속성의 값에 따라 적용되는 가변 속성에 대한 귀하의 설명은 비 관계형 비 정규화 설계입니다. RDBMS는 이러한 종류의 데이터를 저장하는 데 가장 적합한 솔루션이 아닐 수 있습니다. 아마도 RDF는 이러한 수준의 유연성이 필요한 데이터에 좋은 솔루션 일 것입니다.

RDBMS 솔루션과 관련된 나의 이전 답변은 다음과 같습니다.


어떤 사람들은 유연한 속성을 모델링합니다 엔티티 부사장 값 디자인, 그러나 이것은 종종 너무 구조화되지 않았으며 데이터 무결성 문제와 싸우게됩니다. 사실상 무한한 수의 엔티티 하위 유형이 필요한 경우에만 사용하십시오.

다른 사람들은 사용합니다 단일 테이블 상속, 모든 하위 유형에서 사용하는 모든 속성 열을 하나의 매우 넓은 테이블에 넣고 속성이 하위 유형과 관련이없는 행에 null을 남겨 두십시오. 그러나 테이블이 너무 넓어 질 수 있기 때문에 이것은 제한이 있으며, 모든 속성을 의무적으로 만들 수있는 능력을 잃어 버릴 수 있습니다.

비교적 적은 수의 엔티티 하위 유형이있는 경우 각각의 필요한 속성 그룹에 대한 종속 테이블을 작성하는 것이 좋습니다. 종속 테이블의 기본 키를 부모 테이블의 외국 키로 정의하여 일대일 관계를 얻습니다.

CREATE TABLE Vehicles (
  vehicle_id INT PRIMARY KEY
  ...attributes common to all vehicles...
);

CREATE TABLE Automobiles (
  vehicle_id INT PRIMARY KEY,
  ...attributes specific to autos...
  FOREIGN KEY (vehicle_id) REFERENCES Vehicles(vehicle_id)
);

부모 테이블의 기본 키에서 하위 유형을 인코딩하여 조금 더 데이터 무결성을 제공 할 수도 있습니다. 그것은 행을 확인하기위한 것입니다 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 속성이 아닌 데이터 무결성을 시행 할 수있는 더 많은 구조를 제공합니다.

응용 프로그램 로직에서 시행 해야하는 유일한 부분은 Automobiles 각 행에 대해 Vehicles ~와 함께 vehicle_type = '자동차'.

다른 팁

데이터베이스를 사용하여 규칙을 시행하거나 다른 곳에서 소스 코드를 사용하는 것에는 차이가 없습니다. 코드는 데이터입니다. 그것은 난해한 LISP 답변입니다.

당신이 묻는 실제 질문은 이것이 관계형 데이터베이스에서 또는 Algol 가족 언어에서 더 쉬운 지 여부입니다. RDBM을 지정하지 않았으므로 ANSI를 가정하겠습니다. 그것은 이것을 어렵게 만듭니다.

BTW, 이것은 프롤로그에서 쉽습니다. 그러나 그것은 여기도 없습니다.

나는 모든 것에 대한 점검 제약을 사용한다고 말할 것입니다. 이 접근법에 필요한 정신적 변화는 UI가 이러한 태그 관계를 정의하는 방법이 필요하다는 것을 인식하는 것입니다. 전통적으로, 당신은 UI에서 DB로 CRUD 진술을 발행 할 것입니다. 대신, CRUD 점검 제약 조건에 따라 ALTER 테이블 문을 발행해야합니다.

이 접근법에는 두 가지 문제가 있습니다.

  • 이러한 진술은 대부분의 RDBMS에서 매개 변수화 할 수 없습니다. SQL 주입을 생각하십시오.
  • 구현은 전체 ANSI 검사 제약 조건에 대한 지원이 다릅니다. 하위 쿼리가 지원되지 않으면 잊어 버리십시오.

특정 RDBM으로 질문을 명확히 할 수 있다면 더 나은 답변을 제공 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top