Datomic의 데이터 모델링
Datomic을 살펴 봤는데 정말 흥미로워 보입니다. 그러나 Datomic이 기술적으로 어떻게 작동하는지에 대한 아주 좋은 정보 가있는 것 같지만 , 데이터 모델링에 대해 어떻게 생각 해야하는지에 대한 많은 보지.
데이터 모델링을위한 몇 가지 모범 사례는 무엇입니까? 주제에 대한 좋은 자료가 있습니까?
경고 렉터
Datomic은 새롭고 경험이 제한적이라고 대답은 어떤 식 으로든 모범 사례로 전달됩니다. 대신 관계 적 배경을 가진 사람들을 위해 Datomic 소개와보다 생산적인 데이터 저장소에 대한 열망을 사용하십시오.
시작하기
Datomic에서는 도메인 데이터 를 속성 값 을 보유 하는 것으로 모델링합니다 . 참조하기 때문에 다른 엔티티가 수 있습니다 값 의 특성 ,은 모델링 할 당신 수 관계 사이의 엔티티 간단합니다.
처음에 기존의 관계형 데이터베이스에서 데이터를 모델링하는 방식과 크게 다르지 않습니다. SQL 테이블 행은에서 엔터티 이고 테이블의 열 이름 은 가치 가있는 속성 입니다 . 관계 외래 키에 의해 표시되는 값 주키 한 참조 테이블 행의 값을 다른 테이블 열의.
기존 유사성은 도메인을 모델링 할 때 기존 ER 다이어그램을 스케치 할 수 있기 때문에 좋습니다. SQL 데이터베이스에서와 관계에 의존 할 수 있습니다 외래 키가 처리 할 수 있습니다 외래 키를 엉엉 필요가 없습니다. Datomic의 쓰기는 트랜잭션이며 읽기는 일관 적입니다. 따라서 더 큰 그림을 제공하기 위해 조인에 의존하여 세분화가 옳다고 느끼는 수준에서 데이터를 말로 분리 할 수 있습니다. 이는 업데이트 된 많은 유용한 수준의 원 자성을 달성하기 위해 비정규 화 된 국 엔터티가 NoSQL 저장소에서 잃어버린 편의입니다.
이 시점에서 당신은 좋은 출발을하고 있습니다. 그러나 Datomic은 SQL 데이터베이스보다 훨씬 더 유연합니다.
활용
시간은 기본적으로 모든 데이터 모델의 일부로 데이터 기록을 포함 할 필요가 없습니다. 이것은 아마도 Datomic의 참조에서 가장 많이 언급 된 부분 일 것입니다.
Datomic에서 스키마는 SQL에 필요한 "직사각형 모양"으로 엄격하게 정의되지 않았습니다. 즉, 1 개의은 모델을 사용하는 데 필요한 모든 속성을 수 있습니다. 더 많은 것이 NULL
적용되지 않습니다. 또한 식별되는 특정 식별되는 것입니다.
따라서 시간이 지남에 따라 달라지는 도메인의 변경 (또는 도메인에 대한 이해의 변경)에 대응할 수 있습니다. 그래서 뭐? 이 MongoDB 및 CouchDB와 같은 문서 저장소와 다르지.
차이점은 Datomic을 사용하면 영향을받는 모든 엔터티에 원자로 스키마 변경을 적용 할 수 있습니다. 즉 , 커밋 될 때까지 독자에게 영향을주지 않고 실행 되는 임의의 도메인 논리를 기반으로 모든 하나의 모양을 업데이트하기 위해 트랜잭션을 발행 할 수 있습니다 [2]. 나는 관계형 또는 문서 저장소 공간에서 이러한 종류의 힘에 가까운 것을 알지 못합니다.
귀하의 이론은 "단일 테이블에 거주"하는 엄격하게 정의되어 있습니다. Datomic에서 "유형"을 정의하는 항목을 결정합니다. 명시 적으로 선택하고 모델의 모든 엔터티가 :table
"유형"을 나타내는 속성을 갖도록 지정할 수 있습니다 . 또는 "유형"을 준수 할 수 있습니다.
예를 들어 모델은 다음을 요구할 수 있습니다.
- 사람이 속성을 요구
:name
,:ssn
,:dob
- 직원이 필요
:name
,:title
,:salary
- 거주자는
:name
,:address
- 회원은 필요
:id
,:plan
,:expiration
나 같은 의미를 의미합니다.
{:name "Brian" :ssn 123-45-6789 :dob 1976-09-15
:address "400 South State St, Chicago, IL 60605"
:id 42 :plan "Basic" :expiration 2012-05-01}
더 추론 할 수있다 Person
하는 Resident
과Member
하지만 을 Employee
.
Datomic 쿼리는 Datalog 로 표현 되지 않은 데이터 및 리소스를 참조하는 사용자 언어로 표현 된 규칙을 통합 할 수 있습니다. 데이터베이스 함수 를 Datomic 내부에 일류 값으로 사용할 수 있습니다 . 이는 SQL의 저장 프로 시저와 유사하지만 트랜잭션 내에서 값으로 조작 할 수있는 사용자 언어로도 작성됩니다. 이 두 기능을 사용하면 도메인 중심적인 방식으로 쿼리 및 업데이트를 표현할 수 있습니다.
마지막으로, OO와 관계형 세계 사이 의 중재 불일치 는 항상 나를 실망 시켰습니다. 기능적인 데이터 중심 언어 (Clojure)를 사용하면 도움이됩니다. Datomic은 코드에서 스토리지로 연결하기 위해 정신적 체조가 필요하지 않은 충실한 데이터 저장소를 제공합니다.
예를 들어 Datomic에서 다양한는 Clojure (또는 Java) 맵처럼 작동합니다. 객체 인스턴스 또는 일반 데이터 구조로 변환하지 않고 더 수준의 응용 프로그램으로 많은 수 있습니다. 그의 관계를 순회하면 Datomic에서 연관을 느리게 가져옵니다. 그러나 동시 업데이트에도 불구하고 원래 쿼리와 일치 보장이 있습니다. 그리고 내장 된 평범한 이전 맵으로 표시됩니다.
이 데이터 모델링을 더 자연스럽고 제 생각에는 훨씬 덜 싸입니다.
대전 인 함정
충돌하는 속성
위의 예는 모델의 특별 인 함정을 보여줍니다. 나중에
:id
그것도의 속성 이라고 결정 하면Employee
어떻게 될까요? 해결은 속성을 네임 스페이스 로 구성하는 것 입니다. 따라서:member/id
및:employee/id
. 이 작업을 미리 수행하면 나중에 충돌을 피할 수 있습니다.속성의 정의는 (아직) 설명 수 없습니다.
Datomic에서 특정 유형 (인덱싱 여부, 고유 한 유형 등)으로 속성을 정의한 나중에 나중에 사용할 수 없습니다.
ALTER TABLE ALTER COLUMN
여기서는 SQL 용어로 이야기 하고 있습니다. 지금은 올바른 정의로 대체 속성을 생성 할 수 있습니다.이것은 끔찍하게 들릴 수 있지만 그렇지 않습니다. 트랜잭션이 직렬화되기 때문에 새 속성을 생성하고 여기에 데이터를 복사하고 충돌을 해결하고 이전 속성을 제거하는 트랜잭션을 제출할 수 있습니다. 다른 트랜잭션의 간섭없이 실행되며 모국어로 된 도메인 별 논리를 활용하여 작업을 수행 할 수 있습니다. 본질적으로를 발행 할 때 RDBMS가 백그라운드에서 수행하는 작업
ALTER TABLE
이지만 규칙의 이름을 지정합니다."사탕 가게에있는 아이"가되지 마십시오
유연한 스키마는 데이터 모델이 없음을 의미하지 않습니다. 다른 데이터 저장소와 마찬가지로 건전한 방식으로 사물을 모델링하기 위해 사전 계획을 세우는 것이 좋습니다. 할 수 있기 때문이 아니라 해야 할 때 Datomic의 유연성을 활용하십시오 .
지속적으로 변경되는 대용량 데이터 저장 방지
Datomic은 BLOB 또는 지속적으로 변경되는 매우 큰 데이터를위한 좋은 데이터 저장소가 아닙니다. 이전 값의 기록 기록을 유지하고
이전 버전을 (아직) 제거하는 방법이 없기 때문입니다. 이런 종류의 것은 거의 항상 S3와 같은 객체 저장소에 더 적합합니다. 업데이트 : 속성별로 기록 을 비활성화 하는 방법이 있습니다 . 업데이트 : 이제 데이터 를 소비 하는 방법도 있습니다 . 그러나 객체 자체가 아닌 외부 객체에 대한 참조를 저장하는 것이 여전히 BLOB를 처리하는 가장 좋은 방법 일 수 있습니다. 이 전략을 바이트 배열 사용과 비교하십시오 .
자원
- 데이터 메일 링리스트
- Freenode의 IRC 채널 #datomic
메모
- 엔티티 유형으로 더 적절하게 설명되는 테이블 의미가 아니라 행 의미의 엔티티를 의미합니다.
- 내 이해는 현재 Java 및 Clojure가 지원되지만 향후 다른 JVM 언어도 지원 될 수 있다는 것입니다.
bkirkbri의 아주 좋은 대답입니다. 몇 가지 추가하고 싶습니다.
유사하지만 같지 않은 "유형"또는 스키마의 많은 엔티티를 저장하는 경우 스키마에서 다음과 같이 유형 키워드를 사용하십시오.
[:db/add #db/id[:db.part/user] :db/ident :article.type/animal] [:db/add #db/id[:db.part/user] :db/ident :article.type/weapon] [:db/add #db/id[:db.part/user] :db/ident :article.type/candy]
{:db/id #db/id[:db.part/db] :db/ident :article/type :db/valueType :db.type/ref :db/cardinality :db.cardinality/one :db/doc "The type of article" :db.install/_attribute :db.part/db}
읽을 때 쿼리에서 엔티티 ID를 가져 와서 필요한 경우 유형에 대한 다중 메소드 디스패치를 사용 datomic.api/entity
하고 eid
구문 분석하십시오. 더 복잡한 스키마의 모든 속성에 대해 좋은 쿼리를 작성하기가 어렵 기 때문입니다.
참고 URL : https://stackoverflow.com/questions/10357778/data-modeling-in-datomic
'ProgramingTip' 카테고리의 다른 글
여러 문자 구분 기호를 기반으로 분할 분할 (0) | 2020.12.07 |
---|---|
Task.Factory.StartNew를 사용하여 메소드 매개 변수 전달 (0) | 2020.12.07 |
부팅의 라디오 버튼으로 레이블 정렬 (0) | 2020.12.07 |
Linux에서는 하나의 zip 파일에 여러 디렉토리를 압축합니다. (0) | 2020.12.07 |
Visual Studio Code- 가져 오기 견적 설정 조정 (0) | 2020.12.07 |