관계형 데이터베이스 디자인 - 대리 키 대 쿼리 속도, ORM 및 앱 개발의 맥락에서 자연스러운 키

dapper database-design orm relational-database sql

문제

모델 엔티티 집합과 난이도 집합이 있다고 가정합니다. 각 모델에는 주어진 난이도에서 주어진 날에 대해 일정 비율의 성공률이 있습니다.

모델 엔티티는 어떤 상황에서도 고유하고 불변 인 이름을 가지므로 자연스러운 기본 키를 만듭니다. 난이도는 그 이름으로 만 설명됩니다 (쉬운, 보통 등). 난이도 수준은 변경 될 가능성이 매우 낮지 만 매우 어려울 수 있습니다. 성공률 기록은 관련된 모델, 난이도 및 날짜로 고유하게 식별됩니다.

이 시나리오에서 가장 사소한 db 디자인은 다음과 같습니다. 자연 키가있는 DB 디자인

이 디자인에서 'name'은 'models'테이블의 기본 키이며 VARCHAR (20) 필드로 표시됩니다. 마 y 가지로 VARCHAR (20) 필드 'name'은 'difficult_levels'테이블 (찾아보기 테이블)의 기본 키입니다. 'success_rates'테이블에서 'model_name'은 'model'테이블의 'name'필드를 참조하는 외래 키이고 'difficult_level'은 'difficult_levels'테이블의 'name'필드를 참조하는 외래 키입니다. 'model_name', 'difficult_level'및 'date'필드는 'success_rates'테이블에 대한 복합 기본 키를 구성합니다.

가장 많이 사용되는 쿼리는 다음과 같습니다.

  • 특정 모델, 난이도 및 날짜 기간에 대한 모든 성공률 얻기

  • 특정 기간 및 난이도에 대해 가장 성공적인 모델 또는 가장 성공적인 모델을 얻는 것.

지금, 내 질문은 - '모델'및 'difficult_levels'테이블에 대리자 기본 키를 추가해야합니까? 나는 'success_rates'의 외래 키 필드에있는 varchar 값에 비해 int 값을 저장하는 것이 적은 공간을 차지하고 쿼리가 더 빠를 것이라고 추측합니다 (내 야생 추측, 확실하지 않음)?

서로 게이트 키를 사용하여 볼 수있는 문제는 비즈니스 로직 자체와의 관련성이 제로라는 것입니다. 나는 미니 ORM (가장 가능성있는 Dapper)을 사용할 계획이며 대리 키가 없으면 함께 작업하는 엔티티를 매우 깨끗하게 나타내는 클래스에서 작업 할 수 있습니다. 이제 대리 키를 추가하면 클래스에 'Id'속성을 추가해야하며 앱의 어느 위치에서나 사용할 수있는 클래스에 데이터베이스 저장소 구현을 추가하는 것에 반대합니다. 데이터베이스 스토리지와의 연결. Id 속성을 사용하여 프록시 저장소 클래스를 추가 할 수 있지만 다른 수준의 복잡성이 추가됩니다. 또한 'Id'속성이 읽기 전용이 아니기 때문에 (ORM이 엔티티를 데이터베이스에 저장 한 후 ID를 설정할 수 있음) 우연히 임의 / 잘못된 값으로 설정할 수 있음을 의미합니다.

나는 ORM에 익숙하지 않고 Dapper에 대한 지식이 없으므로이 점들 중 어느 것이 잘못되었을 때 나를 바로 잡습니다.

여기서 가장 좋은 방법은 무엇입니까?

인기 답변

서로 게이트 키를 사용하여 볼 수있는 문제는 비즈니스 로직 자체와의 관련성이 제로라는 것입니다.

그것은 실제로 이점이 아니라 문제입니다. 키의 값은 변경 사항에 관계없이 엔티티의 변경 불가능한 식별자입니다. 나는 대체로 (모든 자식 레코드에 대한 핵심 가치의 계단식 변경) 구현이 훨씬 더 어렵 기 때문에 쉽게 사용할 수없는 널리 사용되는 ORM이 있다는 것을 정말로 의심합니다.

또한 난이도가 높아지는 계층 구조를 데이터 모델에 표시 할 수있는 난이도 수준의 값을 추가하는 것이 좋습니다. 그렇지 않으면 "어렵다"또는 "더 쉽습니다"를 강력하게 표현할 수 없습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.