[SQL] SQL 데이터베이스를 설계하는 것은 OO 클래스 계층 구조를 나타내는
SQLSQL 데이터베이스를 설계하는 것은 OO 클래스 계층 구조를 나타내는
나는 SQL 데이터베이스에 저장되는 클래스 계층 구조를 변환하는 과정에있어.
원래 의사 코드 :
abstract class Note
{
int id;
string message;
};
class TimeNote : public Note
{
time_t time;
};
class TimeRangeNote : public Note
{
time_t begin;
time_t end;
};
class EventNote : public Note
{
int event_id;
};
// More classes deriving from Note excluded.
나는 현재 데이터베이스에이를 저장하는 방법을 몇 가지 아이디어가 있어요.
A. 하나의 넓은 테이블의 모든 메모를 저장
표는 주에서 파생하는 모든 클래스에 필요한 모든 정보를 포함한다.
CREATE TABLE t_note(
id INTEGER PRIMARY KEY,
message TEXT,
time DATETIME,
begin DATETIME,
end DATETIME,
event_id INTEGER
);
참고 필요에서 파생 미래 클래스는이 테이블에 새 열을 추가 할 수 있습니다.
B.지도 테이블에 각각의 클래스
CREATE TABLE t_note(
id INTEGER PRIMARY KEY,
message TEXT
);
CREATE TABLE t_timenote(
note_id INTEGER PRIMARY KEY REFERENCES t_note(id),
time DATETIME
);
CREATE TABLE t_timerangenote(
note_id INTEGER PRIMARY KEY REFERENCES t_note(id),
begin DATETIME,
end DATETIME
);
CREATE TABLE t_eventnote(
note_id INTEGER PRIMARY KEY REFERENCES t_note(id),
event_id INTEGER
);
참고 필요에서 파생 미래 클래스는 새 테이블을 만들 수 있습니다.
C. 사용하여 데이터베이스 정규화 및 VARIANT / SQL_VARIANT
CREATE TABLE t_note(
id INTEGER PRIMARY KEY,
message TEXT
);
CREATE TABLE t_notedata(
note_id INTEGER REFERENCES t_note(id),
variable_id TEXT, -- or "variable_id INTEGER REFERENCES t_variable(id)".
-- where t_variable has information of each variable.
value VARIANT
);
참고 필요에서 파생 미래 클래스는 새로운 variable_id를 추가합니다.
D.지도 (새로 현재의 응답에 따라 추가 된) 테이블에 각각의 구체적인 클래스
CREATE TABLE t_timenote(
id INTEGER PRIMARY KEY,
message TEXT,
time DATETIME
);
CREATE TABLE t_timerangenote(
id INTEGER PRIMARY KEY,
message TEXT,
begin DATETIME,
end DATETIME
);
CREATE TABLE t_eventnote(
id INTEGER PRIMARY KEY,
message TEXT,
event_id INTEGER
);
참고 필요에서 파생 미래 클래스는 새 테이블을 만들 수 있습니다.
SQL에서 가장 논리적 인 표현이 될 수 있을까요? 더 좋은 옵션이 있습니까?
해결법
-
==============================
1.일반적으로 나는 옵션 "B"(즉, 하나의 기본 클래스에 대한 테이블과 각 "콘크리트"서브 클래스에 대한 하나의 테이블)을 선호한다.
일반적으로 나는 옵션 "B"(즉, 하나의 기본 클래스에 대한 테이블과 각 "콘크리트"서브 클래스에 대한 하나의 테이블)을 선호한다.
당신은 당신이 서브 클래스의 전체 인스턴스를 읽고있을 때마다 적어도 두 테이블을 조인하는 모두의 첫째 : 물론이 단점 몇 가지가 있습니다. 또한, "기본"테이블은 항상 노트의 모든 종류의에서 작동하는 모든 사용자가 액세스 할 수 있습니다.
당신은 극단적 인 경우를 제외하고 그러나 일반적으로 허용됩니다 (행 수십억, 매우 빠른 응답 시간 등이 필요).
별개의 테이블에 각각의 서브 클래스를 매핑 : 세 번째 가능한 옵션이 있습니다. 이것은 일반적으로 더 많은 개발 노력에 객체하지만 비용을 분할 할 수 있습니다.
완전한 설명은이를 참조하십시오.
(: - 그것은 거래-SQL 무슨 내가 익숙하지 않다가 독점적 인 솔루션처럼 보이기 때문에 내가 아닌 장점 / 단점에 댓글을 추가 할 수 있습니까? VARIANT를 사용하여 "C"솔루션에 대해서?).
-
==============================
2.설명 된대로 'B'옵션은 (쿵, 1990 http://portal.acm.org/citation.cfm?id=79213)이 '오브젝트 서브 클래스 계층 구조'의 거의 구현입니다
설명 된대로 'B'옵션은 (쿵, 1990 http://portal.acm.org/citation.cfm?id=79213)이 '오브젝트 서브 클래스 계층 구조'의 거의 구현입니다
이와 같이, 잘 확립 된 이해 방법이다. 그것은 아주 잘 작동합니다. 또한 상속의 여러 단계를 통해 확장, 당신은 그것을 필요로한다.
당신이 데이터 theough DBMS의 인터페이스에 액세스 할 수있는 사용자를 제한하지 않으면 물론 당신은 캡슐화 및 정보 숨어의 몇 가지 이점을 잃게됩니다.
당신은 그러나 여러 시스템에서 액세스 할 수 있습니다, 심지어 언어, 동시에 (예를 들어, 자바, C ++, C #을) (이것은 내 석사 논문의 주제였다 :)
-
==============================
3.당신은 관계형 데이터베이스에 물체를 모델링의 세 가장 일반적으로 인정되는 방법에 충돌했습니다. 모든 3은 허용, 각각 자신의 장점과 단점을 가지고있다. 불행하게도, 그 수단에는 컷 - 앤 - 건조 "오른쪽"대답이 없다. 나는 다른 시간에 그 각각을 구현했습니다, 여기에서 명심해야 할 몇 가지 사항 /주의 사항입니다 :
당신은 관계형 데이터베이스에 물체를 모델링의 세 가장 일반적으로 인정되는 방법에 충돌했습니다. 모든 3은 허용, 각각 자신의 장점과 단점을 가지고있다. 불행하게도, 그 수단에는 컷 - 앤 - 건조 "오른쪽"대답이 없다. 나는 다른 시간에 그 각각을 구현했습니다, 여기에서 명심해야 할 몇 가지 사항 /주의 사항입니다 :
옵션 A는 새로운 서브 클래스를 추가 할 때, 기존의 테이블을 수정해야하는 단점이있다 (이것은 새 테이블을 추가하는 것보다 당신에게 더 적은 맛이있을 수 있습니다). 또한 많은 열이 null을 포함 할 단점이있다. 그러나 현대 데시벨은 내가 너무 널 걱정 적이 없습니다, 훨씬 더 이전의 DB를보다 공간 관리에 보인다. 한 가지 이점은 검색의 아무도 없거나 잠재적으로 더 나은 성능과 간단한 SQL을 의미하는 필요합니다 작업이 조인 또는 조합 검색 할 수 있습니다.
옵션 B는 당신이 당신의 슈퍼 클래스에 새로운 속성을 추가 할 경우, 당신은 각각의 모든 서브 클래스의 테이블에 새 열을 추가해야하는 단점이있다. 또한 이기종 검색 (한 번에 모든 서브 클래스)를 수행하려는 경우, 당신은 UNION을 사용하여이를 수행해야하며 (잠재적으로 성능 저하 및 / 또는 더 복잡한 SQL)을 가입하세요.
옵션 C는 (심지어 하나의 서브 클래스에 대한) 모든 검색 작업이 의지 대부분의 검색으로, 가입 포함된다는 단점이있다. 또한, 모든 인서트는 다소 복잡한 SQL에 대한 만들기, 여러 테이블을 포함하며, 거래의 사용을 필요로합니다. 이 옵션은 데이터 정규화 관점에서 가장 "순수"것 같다,하지만이 가입 하를 위해 모든 동작하기 때문에 단점은 일반적으로 더 맛이 다른 옵션 중 하나 만들어 나는 거의 사용하지 않는다.
-
==============================
4.나 자신 옵션 A쪽으로 grativate 것입니다.
나 자신 옵션 A쪽으로 grativate 것입니다.
또한 예를 들어, 당신은 노트의 모든 종류에 걸쳐 검색을 많이해야 할 것입니다, 당신의 사용 시나리오에 조금 달려있다? 그렇다면, 당신은 더 나은 옵션 A.와 떨어져있을 수 있습니다
당신은 항상 옵션 A (하나 개의 큰 테이블)로 저장하고 그렇게하십시오 다른 서브 노트 조회수를 만들 수 있습니다. 좋은의 검색 가능성을하면서 그런 식으로, 당신은 여전히 논리적 단락 지을 수 있습니다.
일반적으로, 그러나 이것은 내가 관계형 데이터베이스는 관계형 데이터베이스하고 모방의 OO 구조에 시도하지한다고 생각, 조심 가까운 종교 토론 될 수 있습니다. DB를 관계형하자, 당신의 클래스는 OO 물건을하자. 당신이 당신의 데이터 저장소에이를 확장 할 경우 특정 OO가 가능한 데이터베이스가 있습니다. 그것은 당신이 그들이 그것을 전화로 '객체 관계형 임피던스 부정합을'교차해야하지만, 다시 특정 목적을위한 ORM 매퍼가 있다는 것을 의미한다.
-
==============================
5.나는 옵션 A. 갈 것입니다
나는 옵션 A. 갈 것입니다
클래스 계층 구조는 서로를 상속 클래스의 수십 매우 복잡한 경우 솔루션 B 좋다. 그것은 가장 확장 성있는 솔루션입니다. 그러나, 단점은 SQL이 더 복잡하고 느린 수 있다는 것입니다.
4 ~ 5 클래스 같은 기본 클래스를 상속 모두 같은 비교적 간단한 경우에 대해서는, IT는 SQL은 더 간단하고 빠른 것이다 솔루션 A를 선택할 수있는 더 의미가 있습니다. 그리고 NULL 값으로 추가 열을 갖는 오버 헤드는 무시할 수있다.
-
==============================
6.내가 몇 년 동안 사용했던 '크로싱 협곡 "로 총칭 알려진 일련의 패턴이있다. 스몰 토크에 대한 참조가 당신을 던져하지 마십시오 - 그것은 어떤 객체 지향 언어에 적용 할 수 있습니다. 다음을 참조하십시오 :
내가 몇 년 동안 사용했던 '크로싱 협곡 "로 총칭 알려진 일련의 패턴이있다. 스몰 토크에 대한 참조가 당신을 던져하지 마십시오 - 그것은 어떤 객체 지향 언어에 적용 할 수 있습니다. 다음을 참조하십시오 :
관계형 데이터베이스와 스몰 토크를위한 패턴 언어 교차 협곡 - 정적 패턴 교차 협곡 - 건축 패턴
공유하고 즐길 수 있습니다.
뒤로 기계 내가 건너 협곡 패턴을 발견 할 수있었습니다 모든 것을 링크 : http://web.archive.org/web/20040604122702/http://www.ksccary.com/article1.htm http://web.archive.org/web/20040604123327/http://www.ksccary.com/article2.htm http://web.archive.org/web/20040604010736/http://www.ksccary.com/article5.htm http://web.archive.org/web/20030402004741/http://members.aol.com/kgb1001001/Chasms.htm http://web.archive.org/web/20060922233842/http://people.engr.ncsu.edu/efg/591O/s98/lectures/persistent-patterns/chasms.pdf http://web.archive.org/web/20081119235258/http://www.smalltalktraining.com/articles/crossingchasms.htm http://web.archive.org/web/20081120000232/http://www.smalltalktraining.com/articles/staticpatterns.htm
나는 모든 일에 일관된 전체를 닮은 위에 통합하는 Word 문서를 만들었습니다,하지만 난 그것을 공개적으로 사용할 수 있도록 나는에 드롭 할 수있는 서버가 없습니다. 누군가가 무료 문서 저장소를 제안 할 수 있다면 나는 거기에 문서를 올려 드리겠습니다.
-
==============================
7.나는이 문제가 된 것으로 알려져, 그러나 나는 다른 옵션이 있습니다 :
나는이 문제가 된 것으로 알려져, 그러나 나는 다른 옵션이 있습니다 :
당신은 JSON 구조와 같은 테이블 열 (텍스트 형식)를 참고 객체, 또는 주 객체의 수집에 저장할 수 있습니다. 당신은 직렬화 및 Newtonsoft를 사용하여 JSON 직렬화 할 수 있습니다. 당신은 JsonSerializer에 대한 객체로 지정 유형 이름 처리 옵션에 필요합니다.
from https://stackoverflow.com/questions/3413459/designing-sql-database-to-represent-oo-class-hierarchy by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 키 - 값 쌍 테이블에 1 행 테이블 평탄화 (0) | 2020.06.06 |
---|---|
[SQL] 어떻게 SQL에서 결과의 페이지를 반환? (0) | 2020.06.06 |
[SQL] 다른 테이블의 열이 업데이트 될 때 하나 개의 테이블에 열을 업데이트하는 트리거를 생성 (0) | 2020.06.06 |
[SQL] "and"와 "여기서"에 조인의 차이 (0) | 2020.06.06 |
[SQL] 내가) (ContentResolver.query이 안드로이드 쿼리를 수행 할 수 있습니까? (LEFT는 가입 CASE) (0) | 2020.06.06 |