0

아래에서 필자는 작업중인 데이터베이스의 기본 디자인을 설명합니다. 내가 DB가 아니기 때문에 나는 좋은 길이나 나쁜 길에 있을지 염려하여 약간의 충고를 위해 이것을 띄우고 싶다. 나는 나의 디자인이 적합하다는 비슷한 토론을 찾을 수 없었다.전체 데이터베이스에 대해 공유 열에 대한 마스터 테이블을 사용하고 있습니까?

내 데이터베이스에서 모든 테이블은 엔티티로 간주됩니다. 엔티티는 고객 계정, 사람, 사용자, 직원 정보 집합, 계약자 정보, 트럭, 비행기, 제품, 지원 티켓 등일 수 있습니다. 여기 현재의 엔티티 (테이블)입니다 ...

  • 사람들
  • 사용자
  • 계정
  • AccountUsers
  • 주소
  • 직원 정보
  • 계약자 정보

그리고 이러한 엔티티에 대한 정보를 저장하기 위해 나는 두 개의 테이블이 있습니다

Entity Tables 
-EntityType 
-> EntityTypeID (INT) 
-Entities 
-> EntityID (BIGINT) 
-> EnitityType (INT) : foreign key 

내가 만든 모든 테이블이 자동 생성 된 기본 키와 엔티티 테이블에 ENTITYID 열에 외부 키를 가지고있다. 내가 좋아하는 일부 공유 필드가 엔티티 테이블에서

,

  • DateCreated
  • DateModified는
CanUIDelete
  • 을 isDeleted를 User_Modified User_Created3210

    모든 테이블에서 트리거를 사용하여 삽입시 엔티티 유형이 올바른 엔티티 항목을 자동으로 작성합니다. 업데이트 트리거는 LastModified 날짜를 업데이트합니다. 보기의 응용 프로그램 계층의 관점에서

    이 모든 코드는 개별 개체에 대해 걱정 할 일은이 이제

    을합니다 (USER_Modified/User_Created 필드 "가 그에 대한 업데이트를 수행"을 제외 ENTITYID에 가입하여) 엔티티 테이블의 이유는 EAV 모델을 가질 계획인데, 모든 엔티티 유형을 사용자 정의 필드로 확장 할 수 있습니다. 또한 엔티티에 대한 메타 데이터를 저장하기에 적합합니다 (생성/수정 된 필드와 같은).

    저는 DB 디자인을 처음 접했고 2 단계 의견을 원했습니다.

  • +0

    1. MySQL, SQL Server? 하나를 선택. 2. "나는 EAV 모델을 가질 계획입니다 .... 나는 DB 디자인을 처음 접했을뿐입니다. 분명히. – podiluska

    답변

    2

    나는 EAV 모델을 가질 예정이므로 모든 엔티티 유형을 사용자 정의 필드로 확장 할 수 있습니다.

    왜? 모두 엔티티가 이러한 방식으로 확장 가능해야합니까? 아마 대부분의 응용 프로그램에는 이러한 유연성 수준의 혜택을받을 수있는 하나 또는 두 개의 항목이 있습니다. 다른 주체는 실제로 이 아닌의 안정성과 명료성으로부터 이익을 얻습니다.

    이너 플랫폼 효과는 그것이 설계되었습니다 플랫폼의 가난한 복제되고 끝나도록 사용자 정의 할 수있는 시스템을 설계하는 결과입니다

    EAV는 Inner-Platform Effect의 예입니다. 즉

    은, 지금은 적절한 RDBMS가 이미 제약과 데이터 유형처럼, 제공하는 모든 일을 할 수있는 응용 프로그램 코드를 작성하는 것은 귀하의 책임입니다. NOT NULL과 같이 열을 필수로 만드는 것조차도 EAV에서는 작동하지 않습니다.

    때로는 프로젝트에 많은 테이블이 필요합니다. 그러나 단 두 테이블을 만들어 프로젝트를 간소화했다고 생각하면 스스로 속이고있는 것입니다. 테이블을 가지고있는 것과 똑같은만큼 많은 개별 엔티티를 가질 수 있지만 이제는 쓰레기 더미가되지 않도록해야합니다.

    EAV에 너무 많은 시간을 투자하기 전에 누군가가 데이터 저장소를 임의로 융통성있게 만들려고했기 때문에 거의 작동하지 않는 회사에 대한 이야기를 읽어보십시오 : Bad CaRMa.

    EAV에 대한 자세한 내용은 블로그 게시물 EAV FAIL과 내 서적 SQL Antipatterns: Avoiding the Pitfalls of Database Programming에서 썼습니다.

    +0

    죄송합니다.이 게시물에 대한 모든 것을 잊어 버렸고 오래 전이었습니다. MySql의 스키마 편집기가 바이너리에 저장하기 때문에 MS SQL 2014로 전환했습니다. 또한 나는 지금 VS 2015에서 SSDT를 사용하고있다. 그래서 SSDT "full sql file based design"으로 전체 데이터베이스를 구축 할 수있었습니다. 데이터 레이어는 PetaPoco이고 T4 템플릿을 사용하여 자동으로 pocos 및 데이터 레이어 코드를 생성합니다. 또한 T4 템플릿을 사용하여 자동으로 감사 테이블을 생성했습니다. 그리고 필드를 추가하고자 할 때 우리는 단지 프로젝트를 업데이트하고 변경 사항을 SSDT에 배포하고 petapoco를 재생성합니다. –

    1

    디자인을 실제로 제공하지 않았습니다. 테이블에 대한 설명을 제공했다면 각 행이 언제 행해지는지에 대한 애플리케이션 지향 기준과 엔티티가 관련된 애플리케이션의 일부에 대한 키, fks 등을 포함하는 결과적인 제약 조건이 주어지면 설계의 일부를 부여했을 것입니다. 즉, 해당 파트의 직접적인 관계형 디자인을 제공했다면 말입니다. 이 방법을 구현하지 않는다고해서 제대로 디자인 할 필요가 없다는 것을 의미하지는 않습니다. "사용자 정의 필드로 확장"을위한 응용 프로그램 수준의 상태와 기능이 포함되어야합니다.그러나 테이블에 대한 설명, 각 행에 대한 기준 및 EAV를 통해 이전 파트를 인코딩하는 구현 부분에 대한 키, fks 등을 비롯한 결과적인 제약 조건과이를 조작하는 연산자를 제공해야합니다. 즉, 해당 파트의 직접적인 관계형 디자인을 제공했다면 말입니다. 디자인의 일부는 implementing a DBMS입니다. 그렇다면 실제로 디자인을 부여했을 것입니다.

    EAV를 사용해야하므로 "모든 엔티티 유형을 사용자 정의 필드로 확장 할 수 있습니다"라는 생각은 잘못되었습니다. DML 대신 DDL로 일반 테이블을 업데이트하는 대신 메타 데이터 테이블을 업데이트하는 호출을 통해 구현하십시오.