우리 팀은 외래 키 관계를 가진 관계형 데이터베이스 엔터티가 무서워서 왜 그런지 모르겠습니다.


12

나는 대학에서 비교적 신선하지 않기 때문에 관계형 데이터베이스에 대한 대부분의 친숙 함은 BCNF 또는 3NF에없는 것이 비극적 인 데이터베이스 과정에서 나온 것입니다. 확실히 그것은 극단적 인 것의 한 끝이지만, 직장에서 우리 팀은 그것을 완전히 반대쪽 끝으로 가져가는 것 같습니다.

마이크로 서비스 db 스키마에서 엔티티는 하나 이상의 테이블을 갖는 경우가 거의 없습니다. 일반적으로 다른 테이블로 정규화하는 모든 항목은 json 열에 저장됩니다. 나중에이 json의 속성 중 하나를 쿼리해야한다는 것을 알게되면 새 열이 추가되고 데이터가 두 위치에 저장됩니다 (예, 동일한 테이블의 두 개의 다른 열에).

많은 경우 이러한 json 컬럼은 확실히 이점이 있습니다. 해당 데이터를 쿼리 할 필요가없고 해당 데이터를 일방적으로 변경할 필요가없는 경우 (명백하게 예측할 수없는 것) 나쁜 생각이 아닙니다. 또한 많은 서비스는 서버를 보지 못하거나 필요한 디스크 공간이 불필요한 머신에서 호스팅되므로 데이터 복제가 큰 문제가되지 않습니다. (나는 일반적으로 철학에서 피하고 싶은 것이 있지만)

현재 우리는 자신이 소유 한 일련의 조건에 따라 규칙과 일치하는 서비스를 구축 한 다음 규칙이 참일 때 해당 규칙과 관련된 일련의 작업을 수행합니다 (예 : 모든 조건이 참). 이 서비스를 가장 즉시 구축하는 하위 팀은 스키마의 규칙에서 멀어지면 작업 및 조건을 정상화하는 데 상당한 이점이 있다고 생각합니다. 분명히이 테이블은 규칙 ID와 외래 키 관계를 유지합니다. 우리의 관점에서 우리는 조건에 대한 데이터 복제를 피할 수 있으므로 한 번만 평가할 수 있으며 모든 단일 규칙을 제거하고 메모리에서 검색하지 않고도 필요할 때 필요한 조건과 규칙을 쉽게 찾을 수 있습니다.

오늘 우리의 주요 엔지니어 중 한 명과 이야기하면서 그는이 스키마에서 멀어 지도록 노력했습니다. 우리가 실제로 필요로하지 않는 모든 방식으로 논쟁하려고하면 미래에 성능 문제가 발생할 것입니다. 우리가 소유하고있는 오래된 모놀리스를 참조하십시오. 그는 우리가하고있는 것을 "구식"이라고하고, json을 "새로운 방식"이라고하는 평평한 테이블을 언급했습니다. 그는 원 자성을 원하는 곳에서는 필요하지 않으며 쿼리 대신 메모리에서 더 많은 일을해야한다고 주장했습니다. 이것은 현재 많은 서비스가 따르는 디자인 원칙입니다. 우리는 데이터의 양이 크게 증가하여 쿼리를 빨리 유지해야 할 것으로 예상하지 않습니다. 우리가 예상하는 것은 규칙 평가 및 조치 수행에 많은 시간이 소요됩니다.

최근 몇 년 동안 비 관계형 데이터베이스가 널리 보급되었다는 것을 알고 있지만 외래 키 관계의 성능 영향에 대한 정보를 적극적으로 검색하더라도 많은 정보가 그의 사례를 보여주지 못합니다. 나는 그들이 문제를 일으킬 수있는 큰 트랜잭션을 도입하는 경향이 있다고 생각하지만 외래 키 자체와는 독립적 인 문제처럼 보입니다.

이것이 내 순진한가? 아니면 이것이 정말로 저와 저의 하위 팀이없는 것입니까? 필자는 그 해결책을 찾지 않아도되기 때문에 문제에 대한 자세한 정보를 명시 적으로 제공하지 않았습니다. 그것이 우리의 큰 팀에서 일반적인 경향을 감안할 때, 그들이 이것과 관련이 있다면 정말 궁금합니다.


제목에서 귀하의 질문에 대한 답변은 "귀하의 회사의 오래된 단일체 때문에 두려워합니다"입니다. 그러나 질문의 ​​본문은 "다른 외래 키가 성능 문제를 유발합니까?"
Christian Hackl

2
그들이 "앱"코드로 구축 한 RDBMS의 %가 궁금합니다
Caleth

접근 방식의 우수성 여부는 구축중인 응용 프로그램의 종류, 요구 사항 및 진행 방향 (요구 사항, 구조적 제약 조건)에 따라 달라집니다. 여기에서는 실제로 평가할 수 없습니다. NoSQL의 경우 전체 수평 확장 성을 지원하고 모든 응용 프로그램이 RDBMS의 엄격한 제약 조건을 요구하는 것은 아니라는 인식에 관한 것이 전부였습니다. 자세한 내용을 보려면 여기에 상위 3 개의 답변을 시작점으로 사용하십시오 (두 번째 및 세 번째 심도가 더 깊음).
Filip Milovanović

2
기술적이지 않은 조언을 제공 할 수 있다면, 약간 내리십시오. 설계 결정에 관여하지 않았고 실제 경험을 최소화 한 위치에서 수행하는 작업에 대해 많은 판단 ( "예, 동일한 테이블에있는 두 개의 다른 열", "디자인 궤적")을 통과했습니다. . 프로젝트를 보지 못했기 때문에 당신이 옳고 그름이라고 말할 수는 없지만 시스템은 일련의 타협으로 완제품이 기능적이지만 개념적으로 덜 순수합니다. 당신의 경력이 발전하고 결정을 내리는 것이 직업의 일부가됨에 따라 이것은 더 명확해질 것입니다.
Blrfl

@Blrfl 훌륭하게 넣어
Robbie Dee

답변:


8

팀이 어디에서 왔는지 이해하기위한 핵심 단어는 "마이크로 서비스"입니다. 특히 다음 정보에 대해서는 해당 개념을 먼저 읽어 볼 가치가 있습니다.

  • 데이터는 어떻게 저장해야합니까?
  • 설계 원칙?
  • 그것들은 어떻게 확장되도록 설계 되었습니까?

작업을 수행하는 비교적 새로운 방법과 마찬가지로 소프트웨어 아키텍처와 관련하여 5-10 년이 비교적 새로운 경우와 마찬가지로 이상과 현실은 약간 다릅니다.

이상 중 하나는 모든 마이크로 서비스에 자체 데이터 저장소가 있어야한다는 것입니다. 참고 : 나는 데이터베이스가 아니라 데이터 저장소를 말했다. 일반 데이터베이스와 달리 검색 엔진, Blob Storage 또는 간단한 캐싱을 원하는 경우가 있습니다. 누구에게 이야기 하느냐에 따라 마이크로 서비스 인스턴스 당 데이터 저장소로 갈 수도 있습니다.

결론은 인터넷 규모로가는 것에 대해 이야기 할 때 ACID (원 자성, 일관성, 격리 및 내구성) 트랜잭션의 안전성과 친숙 함은 하나의 데이터베이스에 수백만 명의 사용자가있을 때 확장되지 않는다는 것입니다. NoSQL의 출현으로 패러다임은 BASE (Basically Available, Soft state, Eventual 일관성)로 더욱 이동했습니다. ( 참고 )

데이터 관리 방법의 PH를 변경하면 다음과 같은 영향이 있습니다.

  • 데이터베이스가 당신을 돌보는 데 사용 된 것들을 지금 코드로 관리해야합니다
  • 서버에 "무한"리소스를 추가하는 것보다 문제에 더 많은 마이크로 서비스 인스턴스를 던져서 확장하는 것이 더 쉽습니다.
  • 복잡성이 증가함에 따라 안정성이 향상됩니다

팀의 세부 사항이나 솔루션의 규모에 대해서는 답변을 드릴 수 없지만 일반적으로 솔루션이 전부 또는 전혀 필요하지는 않습니다. 나는 여기 앉아서 팀이 올바른 선택을하고 있는지 판단하지 않을 것입니다. 나는 단지 당신이 적어도 어디에서 왔는지 이해할 수 있도록 약간의 맥락을 제공하고 있습니다.


+1 훌륭한 것-마이크로 서비스에는 미묘한 점이 많기 때문에 데이터베이스를 스왑 아웃하는 경우가 아닙니다.
로비 디

@RobbieDee가 동의했습니다. 그 세계에는 많은 복잡성이 있으며 모든 사람들이 세부 사항에 동의하는 것은 아닙니다.
Berin Loritsch

이것이 답이되어야합니다. 자체 데이터 저장소가있는 각 마이크로 서비스에 대한 정보는 실제로 차별화 요소입니다. 데이터 스토리지 요구 사항과 솔루션을 크게 변경하고 ACID 호환 데이터 저장소는 그다지 큰 이점이 아닙니다.
Greg Burghardt

7
좋은 대답이며, 나는 그것을 찬성했다. "인터넷 규모"라고 언급 한 것은 가장 큰 회사 에만 적용됩니다 . 대다수의 회사 데이터베이스 및 웹 사이트 (95 %라고 말함)에서 "기존의"정규화 된 SQL 데이터베이스는 여전히 완벽하게 실행 가능합니다.
Robert Harvey

@RobertHarvey, 전심으로 동의합니다. 필자가 작성한 내용을 지정하는 마이크로 서비스에 대한 여러 기사를 읽었습니다. 자체 프로젝트에서는 적절한 정규화 및 제약 조건이있는 SQL 데이터베이스를 사용합니다. 그것은 순수 주의자들의 마음을 아프게 할 것이지만, 현실은 우리의 사용자 기반이 (수백 또는 사용자) 다소 작고 데이터베이스가 우리에게 성능 문제가 아니었다는 것입니다.
Berin Loritsch

3

좋아, 프로젝트의 주요 엔지니어가 아니라면이 프로젝트에 대한 그의 지시를 따라야합니다.

본인이 원하는 시스템 설계 및 프로토 타입을 집에서 사용하여 장단점을 이해할 수 있도록 권장합니다. 자신의 교육을 위해이 작업을 수행하고 실제 사례를 보여줄 수있는 경우에만 직장에서 언급하십시오.

내 경험에 따르면 제약 조건으로 인해 데이터베이스 성능이 저하된다는 주장이 있습니다. 그리고 네, 그 제약 조건을 확인해야합니다. 그러나 데이터베이스가 일치하지 않을 경우 훨씬 더 큰 문제이며이를 보상하기 위해 SQL 및 더 많은 코드를 작성하여 시스템의 복잡성을 증가시키고 속도를 늦추는 경우가 많습니다.

3nf는 적절하게 수행되면 저장되는 중복 데이터가 적기 때문에 더 많은 데이터베이스를 캐시 할 수 있으므로 데이터베이스를 더 빠르게 만듭니다. 그러나 현재 작업에서 정규화 된 데이터베이스와 정규화되지 않은 데이터베이스 간의 성능 차이를 실제로 볼 수있을만큼 충분한 데이터 집합이 없을 수 있습니다.


+1 좋은 생각입니다. 또한 개발 기계에 비해 용량이 너무 크면 1 in N 샘플로도 큰 통찰력을 얻을 수 있습니다.
로비 디

2

나는 그들이 참조 무결성 자체가 아니라 이전에 있었던 것과 같은 오래된 "비극"을 다시 만드는 것이 두렵다 고 생각합니다.

그는 원 자성을 원하는 곳에서는 필요하지 않다고 주장했습니다 ...

원 자성을 필요로하는 확실한 경우 (일명 비 기능 요구 사항)를 만들 수있는 경우 원 자성을 제공하기 위해서는 견고하고 반론적인 주장이 필요합니다.

... 쿼리 대신 메모리에서 더 많은 일을해야합니다. 이것은 디자인 원칙입니다 ... 우리는 데이터의 양이 크게 커질 것으로 기대하지 않습니다 ...

의합시다 희망 당신이 맞아요을. 성능을 유지하기 위해 "충분히 작은"상태를 유지하는 데이터에 의존하는 것은 위험하다고 제안합니다.

또한이 규칙의 변경 률은 얼마입니까? 중복이 많을수록 여러 장소에서 같은 일을 업데이트하는 데 더 많은 시간 (일명 돈)이 낭비됩니다.


1

RDBMS의 핵심 개념은 40 년이 넘었습니다. 당시에는 스토리지가 매우 비싸고 모든 종류의 중복성이 생겼습니다. RDBMS의 기본 개념은 여전히 ​​타당하지만, 성능에 대한 비정규 화 (조인 감소) 아이디어는 최근 수십 년 동안 일반적으로 받아 들여졌습니다.

따라서 지정된 크기의 RDBMS의 경우 일반적으로 성능을위한 논리적 설계 (중복없이) 및 물리적 설계 (중복없이)가 있습니다.

스토리지가 저렴하고 프로세서가 그 어느 때보 다 빠른 오늘날으로 빠르게 나아 가기 때문에 이러한 설계 압력 중 일부는 그다지 중요하지 않습니다. 궁극적으로 중복 및 고아 기록에 관심 이 있는지 판단해야 합니다. 뱅킹과 같은 일부 산업의 경우 데이터 정확성이 중요하므로 RDBMS에서 어떻게 벗어날 지 알기가 어렵습니다. 다른 산업의 경우 새로운 플레이어가 항상 시장에 진입하므로 선택의 폭이 넓습니다.

RDBMS가 가져올 수있는 제한으로 인해 팀이 불편한지 여부는 누구입니까? 필자가 아는 주니어 개발자들은 이전 세대의 개발자들이했던 RDBMS를 가지고 있지는 않지만 개발자 기술과 데이터베이스 플랫폼의 확산과 관련이있을 것이다.

개발자가 배울 수있는 기술의 끝은 없으며 경력에 맞는 펀트를 만들기가 어려울 수 있습니다. 확실히 개발자가 모든 거래의 잭이 된 시대는 이미 지나갔습니다. 배울 수있는 것이 너무 많습니다.

그러나-손에 질문에. 본인의 승인으로 데이터 볼륨이 커지는 것을 기대하지 않고 시스템의 성능이 향상됩니다. 눈에 띄는 이점없이 물건을 리엔지니어링한다는 아이디어를 판매하는 것은 상당히 신축적일 것입니다. 아마도 RDBMS 접근 방식 이점을 얻을 수 있는 개념 증명을 수행 할 수 있다면 다른 이야기가 될 것입니다.


1
이것이 왜 다운 보트입니까? 이것은 균형 잡힌 대답입니다. 실용주의 +1
Dirk Boer

실용주의는 좋지만 여전히 조심해야합니다. 프로젝트 시작시 성능 이름으로 데이터를 비정규 화하면 조기 최적화가 필요합니다. 작동하는 오래된 시스템을 다시 엔지니어링하지 않는 것은 분명히 실용적이고 좋은 선택이지만 "우리는 항상 정반대로 해왔고 작동합니다"라는 이름으로 업계 표준에 맞는 새로운 시스템을 설계하는 것을 거부하는 것은 좋은 주장과 거리가 멀습니다. .
Vincent Savard

프로젝트가 시작될 때 퍼포먼스라는 이름으로 데이터의 비정규 화 ... 힌트 :하지 말 것 :)
Robbie Dee

1
RDBMS의 가치는 디스크 효율성에서 비롯되지 않습니다.
TehShrike

0

사용중인 데이터베이스에 따라 다릅니다.

전통적인 RDBMS에서는 맞습니다. 데이터 복제는 혐오입니다. 열과 해당 json 동등성은 강제 할 것이 없기 때문에 불가피하게 동기화되지 않을 것입니다. 외래 키 지원은 잘 알려져 있으며 관계를 설명하고 시행하는 데 큰 역할을합니다. 원자 성은 데이터로 거의 모든 작업을 수행하는 데 필수적입니다.

nosql 종류의 설정에서는 덜 명확합니다. 확고한 관계가 없기 때문에 관계 시행이 덜 중요해집니다. 열 인덱스가있는 이러한 종류의 json 내용은 이러한 시스템에서 훨씬 일반적입니다. 관계가 없기 때문에 동기화되지 않을 가능성이 적기 때문입니다. 그리고 원자 성은 단일 테이블로 제한됩니다. 그것이 nosql이 작동하는 방식이기 때문입니다.

더 나은 방법은 실제로하고있는 것과 실제로 필요한 것에 따라 다릅니다.

그러나 동료가화물 컬트에있는 것처럼 들립니다. 그들은 오래된 나쁜 것들에 물렸으므로 이제는 새로운 반짝이는 것이 필요합니다. 몇 년 동안, 새로운 반짝이는 것에 물린 후에는 SQL vs noSQL이 일련의 트레이드 오프라는 것을 깨닫게 될 것입니다.

그러나 그들은하지 않습니다. 잘만되면 당신은 할 것이다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.