코드드와 SQL에서 ACID와 ERP까지 관계형 데이터베이스의 명확한 역사와, 왜 대부분의 비즈니스 앱을 지탱하는지 및 한계는 무엇인지 설명합니다.

“비즈니스 애플리케이션”은 주문 수주, 송장 발행, 고객 추적, 재고 관리, 공급업체 결제, 지난주(또는 오늘 아침) 일어난 일을 보고하는 등 일상 운영을 움직이게 하는 모든 시스템입니다. ERP가 구매와 재무를 처리하든, CRM 소프트웨어가 영업 활동을 정리하든, 이들 앱은 공통 요구사항 하나에 의존합니다: 숫자와 기록이 현실과 일치해야 합니다.
관계형 데이터베이스는 정보를 테이블에 저장합니다—엄격한 규칙을 가진 스프레드시트라고 생각하면 됩니다. 각 테이블은 행(개별 레코드)과 열(고객 이름, 주문 날짜, 가격 같은 필드)을 가집니다. 테이블은 키를 통해 서로 연결됩니다: Customers 테이블의 고객 ID가 Orders 테이블에서 참조되면 시스템은 어떤 주문이 어떤 고객에 속하는지 알 수 있습니다.
이 구조는 단순해 보이지만 강력합니다: 여러 사람과 프로세스가 동시에 다루더라도 비즈니스 앱이 데이터를 정리된 상태로 유지할 수 있게 해줍니다.
관계형 데이터베이스가 비즈니스 애플리케이션의 표준 기반이 된 데는 몇 가지 실용적인 이유가 있습니다:
관계형 시스템은 특히 데이터 무결성과 신뢰할 수 있는 트랜잭션에서 명확한 강점을 가지지만, 유연성과 확장성 측면에서 절충도 발생합니다. 우리는 왜 전형적인 OLTP 작업에 잘 맞는지, 대안들이 어디에서 빛나는지, 관리형 클라우드 데이터베이스와 새로운 데이터 요구로 무엇이 변하고 있는지를 다룰 것입니다.
관계형 데이터베이스가 보급되기 전에는 많은 비즈니스 데이터가 파일의 조합으로 존재했습니다: 공유 드라이브의 스프레드시트, 회계 도구에서 내보낸 평문 파일, 공급업체나 내부 개발자가 만든 커스텀 파일 포맷 등.
이 방식은 회사가 작고 소수만 데이터에 접근할 때는 작동했습니다. 하지만 영업, 재무, 운영이 동일한 정보를 필요로 하면 파일 기반 저장소는 금세 한계를 드러냈습니다.
많은 조직은 다음에 의존했습니다:
가장 큰 문제는 단순한 불편함이 아니라 신뢰 문제였습니다. 중복된 데이터가 곳곳에 있었고 동일한 고객이 약간씩 다른 이름, 주소, 결제 조건으로 세 번 나타나기도 했습니다.
업데이트는 사람들의 기억에 의존했기 때문에 일관성이 없었습니다. 새 전화번호가 영업 스프레드시트에는 반영되지만 청구에는 반영되지 않아 결제 누락이나 발송 지연이 발생할 수 있었습니다.
보고는 어려웠습니다. 파일은 “연체된 고객 중 미결 주문이 있는 고객은 누구인가?” 같은 질문에 답하도록 설계되지 않았습니다. 수동 조회, 길고 복잡한 스프레드시트 수식, 또는 파일 레이아웃이 바뀔 때마다 깨지는 커스텀 스크립트에 의존해야 했습니다.
파일은 동시 편집을 잘 처리하지 못합니다. 두 사람이 같은 레코드를 업데이트하면 서로 덮어쓸 수 있고, 파일을 잠그면 다른 모든 사용자가 기다려야 합니다. 특히 네트워크 상에서 파일 크기가 커지면 성능이 급격히 떨어집니다.
기업들은 규칙이 있어 데이터가 유효하게 유지되고(데이터 유효성), 업데이트가 신뢰할 수 있어 변경이 전부 적용되거나 전혀 적용되지 않도록 하는 공유된 진실의 원천을 필요로 했습니다. 이런 압력이 관계형 데이터베이스로의 전환과 “문서 속의 데이터”에서 “관리되는 시스템으로서의 데이터” 전환을 촉발했습니다.
1970년 IBM 연구원 Edgar F. “Ted” Codd는 관계형 모델을 제안했고, 이는 기업이 데이터를 저장하고 사용하는 방식을 재구성했습니다. 혁신은 더 빠른 저장장치나 컴퓨터가 아니라, 데이터를 일관되게 관리할 수 있도록 데이터를 바라보는 더 단순한 사고방식이었습니다.
관계형 모델의 핵심은 단순한 개념입니다: 정보를 **관계(relations)**로 조직하는 것—오늘날 대부분 사람들이 이해하는 테이블입니다. 테이블은 행(레코드)과 열(필드)을 포함합니다. 고객은 한 테이블, 송장은 다른 테이블, 제품은 또 다른 테이블에 넣습니다.
강력했던 점은 테이블 형식 자체뿐만 아니라 그 주위의 규칙이었습니다:
이 구조는 데이터를 검증하기 쉽게 하고 결합하기 쉽게 만들며, 실수로 모순되는 것을 어렵게 만들었습니다.
이전 시스템은 종종 비즈니스 규칙과 데이터 포맷을 애플리케이션 자체에 ‘구워 넣었습니다’. 소프트웨어를 바꾸면 파일 읽기 방식이 망가질 위험이 있었고, 파일 포맷을 바꾸면 소프트웨어 일부를 다시 써야 했습니다.
관계형 모델은 깔끔한 분리를 장려했습니다: 데이터베이스가 데이터와 무결성을 관리하고, 애플리케이션은 잘 정의된 연산을 통해 데이터를 요청하고 갱신한다는 원칙입니다.
이 분리는 비즈니스가 자주 변하기 때문에 중요합니다. 가격 규칙이 바뀌고, 고객 필드가 진화하며, 보고 요구가 늘어납니다. 관계형 데이터베이스를 사용하면 많은 변경이 데이터베이스 스키마나 쿼리 수준에서 일어나고 애플리케이션을 통째로 재구성할 필요가 줄어듭니다.
데이터가 일관된 규칙으로 테이블에 저장되면 더 이식 가능하고 오래 지속됩니다:
이것이 관계형 모델이 비즈니스 소프트웨어에 자연스럽게 맞아떨어진 이유입니다: 지저분한 애플리케이션 전용 데이터를 성장과 변화 속에서도 생존할 수 있는 정돈된 시스템으로 바꿨습니다.
관계형 데이터베이스가 비즈니스에서 신뢰를 얻은 이유는 데이터에 신뢰할 수 있는 “정체성”을 부여하고 레코드를 연결하는 통제된 방법을 제공했기 때문입니다. 그 정체성이 키이고, 연결이 관계입니다.
**기본 키(Primary key)**는 테이블의 행을 고유하게 식별합니다. Customers 테이블에서는 예를 들어 CustomerID가 될 수 있습니다.
Customers(CustomerID, Name, Email)Orders(OrderID, CustomerID, OrderDate, Total)여기서 CustomerID는 고객의 안정적인 식별자이며, 변경될 수 있는 이름이나 중복될 가능성이 있는 이메일 같은 값이 아닙니다.
**외래 키(Foreign key)**는 다른 테이블의 기본 키를 참조하는 필드입니다. Orders의 CustomerID는 Customers.CustomerID를 가리킵니다.
이 구조는 주문마다 고객의 상세를 반복 저장하는 것을 피합니다. 대신 정보를 한 곳에 저장하고 주문은 해당 고객으로 연결합니다.
데이터베이스가 테이블들이 어떻게 연결되는지 알고 있으므로, 이를 **조인(join)**하여 일상적인 질문에 답할 수 있습니다:
필요한 결과를 쿼리 시점에 테이블을 결합해서 얻지, 같은 사실의 여러 사본을 유지하지 않습니다.
관계형 데이터베이스는 참조 무결성을 강제할 수 있습니다: 존재하지 않는 고객을 참조하는 주문은 허용되지 않습니다. 이는 고아 레코드(유효한 고객이 없는 주문)를 방지하고 연결을 깨뜨리는 실수성 삭제를 막습니다.
키, 관계, 무결성 규칙이 적용되면 보고서가 운영과 어긋나는 일이 줄어듭니다. 합계가 중복 고객 행 때문에 바뀌지 않고, 지원팀은 일치하지 않는 ID 때문에 발생하는 ‘미스터리 에러’를 쫓는 데 시간을 덜 소비합니다.
정규화는 본질적으로 동일한 사실을 여러 곳에 저장하지 않도록 데이터 구조를 설계하는 것입니다. 동일한 정보의 복제본은 일관성에서 벗어날 가능성을 늘리기 때문에 이를 줄이는 것이 목적입니다.
주문을 저장하는 비즈니스 앱을 상상해보세요. 각 주문 행에 고객의 전체 배송 주소가 포함되어 있다면 그 주소는 반복되어 저장됩니다. 고객이 이사하면 과거와 미래 모든 주문 레코드를 업데이트해야 합니다(또는 어느 행을 업데이트해야 할지 애플리케이션이 추정해야 합니다). 하나라도 놓치면 동일 고객에 대해 두 가지 다른 “진실”이 보고서에 나타납니다.
정규화를 적용하면 보통 고객의 주소를 Customers 테이블에 한 번만 저장하고 각 주문은 CustomerID로 참조합니다. 이제 한 군데만 업데이트하면 모두 일관성을 유지합니다.
비즈니스 시스템에서 자주 나타나는 구성요소는 다음과 같습니다:
order_status의 “Pending”, “Shipped”, “Cancelled”)을 작은 테이블로 관리해 오타를 줄이고 변경을 통제합니다.OrderItems 같은 별도 테이블로 깔끔하게 연결합니다.정규화를 많이 하면 일관성은 높아지지만 테이블 수가 늘고 조인이 많아져 일부 쿼리가 더 작성하기 어렵고 느려질 수 있습니다. 과도한 정규화는 실무상의 성능과 보고 요구를 복잡하게 만들 수 있어, 팀들은 보통 “깨끗한 구조”와 실제적 보고/성능 요구 사이에서 균형을 잡습니다.
관계형 데이터베이스는 데이터를 깔끔하게 저장했을 뿐만 아니라 공통의 방식으로 질문할 수 있게 만들었습니다. SQL(Structured Query Language)은 도구와 사람이 별도 프로그램 없이 테이블에서 답을 뽑을 수 있는 공유 언어를 제공했습니다.
SQL이 널리 채택되기 전에는 데이터 질의가 공급업체별 명령어나 일회성 스크립트에 의존했습니다. 표준 질의 언어는 이를 바꿨습니다. 애널리스트, 개발자, 리포팅 도구가 모두 같은 핵심 어휘로 데이터베이스와 대화할 수 있었습니다.
이 표준화는 팀 간 마찰을 줄였습니다. 재무팀을 위해 작성한 쿼리를 운영팀도 재사용할 수 있었고, 리포팅 도구는 최소한의 변경으로 다른 데이터베이스에 연결할 수 있었습니다. 시간이 지나면서 SQL 역량은 직무와 산업을 초월해 이식 가능한 스킬이 되었고, 이는 SQL 확산을 가속화했습니다.
SQL은 실제 비즈니스 질문과 밀접하게 맞물립니다:
이 질문들은 필터링, 정렬, 그룹화, 관련 데이터의 조인과 같은 작업과 정확히 일치합니다.
SQL이 보편화되면서 BI 대시보드, 정기 보고서, 스프레드시트 커넥터, 그리고 이후에는 데이터 웨어하우스와 ETL 도구 같은 생태계가 형성되었습니다. 기업들이 전문 분석 시스템을 추가할 때에도 SQL은 운영 데이터와 의사결정의 다리 역할을 하는 경우가 많았습니다—이미 모두가 믿고 사용할 수 있는 언어였기 때문입니다.
비즈니스 앱이 “신뢰할 수 있다”는 느낌을 주려면 데이터베이스가 특히 돈, 재고, 고객 약속과 관련된 변경을 안전하게 처리해야 합니다.
온라인 주문을 떠올려보세요:
트랜잭션은 이러한 업데이트를 하나의 작업 단위로 취급한다는 뜻입니다. 도중에 문제가 발생하면 데이터베이스는 롤백하여 기록을 깔끔하고 일관된 상태로 유지합니다—“결제되었지만 주문이 없는” 상황, 음수 재고, 누락된 송장 같은 문제를 막습니다.
기업들이 관계형 데이터베이스를 신뢰하는 이유는 대부분의 시스템이 ACID 동작을 지원하기 때문입니다—핵심 규칙은 다음과 같습니다:
비즈니스 소프트웨어에서는 영업 담당자가 견적을 내고, 창고 직원이 피킹을 하며, 재무가 마감 작업을 하고, 지원이 환불을 처리하는 등 많은 사람이 동시에 작업합니다. 강력한 동시성 제어가 없으면 두 사람이 마지막 재고를 동시에 팔거나 서로의 수정을 덮어쓸 수 있습니다.
데이터 무결성은 실무적 결과입니다: 재무 합계가 일치하고, 재고 수가 현실과 맞으며, 규정 보고에 누가 언제 무엇을 했는지 추적 가능한 기록이 남습니다. 그래서 RDBMS는 “시스템 오브 레코드” 데이터의 기본 집이 되었습니다.
대부분의 비즈니스 앱은 사용자가 버튼을 누를 때마다 “이번 분기에 무슨 일이 있었나?”를 묻는 것이 아니라 간단하고 빈번한 작업을 수행합니다: 송장 생성, 배송 상태 업데이트, 재고 예약, 결제 기록 등. 이 패턴을 **OLTP(온라인 트랜잭션 처리)**라고 부릅니다—많은 사용자로부터 작고 빠른 읽기/쓰기가 계속 발생합니다.
OLTP에서는 빠르고 일관된 상호작용이 목표입니다: “이 고객을 찾아라”, “이 항목을 추가하라”, “이 주문을 결제 처리하라.” 쿼리는 보통 데이터의 작은 부분만 건드리고 빠르게 돌아와야 합니다.
분석 워크로드는 다릅니다: 쿼리는 적지만 훨씬 무겁습니다—집계, 대규모 스캔, 광범위한 조인(“지난 18개월 지역별 총매출”) 등. 많은 조직이 OLTP는 RDBMS에 두고 분석은 별도 시스템이나 읽기 복제본에서 처리해 일상 운영이 느려지지 않게 합니다.
인덱스는 테이블의 색인과 같습니다. customer_id = 123을 찾기 위해 모든 행을 훑지 않고도 바로 해당 행으로 점프할 수 있게 해줍니다.
대가가 있습니다: 인덱스는 유지되어야 합니다. 삽입/업데이트마다 하나 이상의 인덱스를 갱신해야 하므로 인덱스가 너무 많으면 쓰기 성능이 느려지고 저장 공간이 늘어납니다. 핵심은 자주 검색하거나 조인하는 컬럼에만 인덱스를 만드는 것입니다.
데이터와 트래픽이 증가하면 관계형 데이터베이스는 쿼리 플래닝(효율적인 쿼리 실행 방식 선택), 제약조건(데이터가 유효하도록 하여 정비 작업을 줄임), 그리고 백업·시점 복구 같은 운영 도구에 의존합니다. 이런 ‘지루한’ 기능들이 일상 시스템을 확장하면서도 신뢰할 수 있게 유지합니다.
빈번한 필터/조인에 인덱스가 없으면 고전적 문제로, 10k 행에서는 빠르던 페이지가 10M 행에서는 느려집니다.
애플리케이션 패턴도 중요합니다. N+1 쿼리(아이템 목록을 하나의 쿼리로 가져온 뒤 각 아이템에 대해 별도 쿼리 실행)는 데이터베이스를 압도할 수 있습니다. 그리고 불필요한 과도한 조인은 쓸데없는 작업을 만들어냅니다. 쿼리를 목적에 맞게 유지하고 실제 운영과 유사한 데이터로 측정하는 것이 대부분의 성능 개선 포인트입니다.
ERP와 CRM이 관계형 데이터베이스를 채택한 이유는 단지 인기 때문이 아니라 테이블, 키, 관계가 강제하는 일관성이 필요했기 때문입니다.
대부분의 핵심 비즈니스 프로세스는 구조화되고 반복 가능하며, 고객이 주문하고 송장이 발행되며 결제가 기록되고 상품이 피킹/발송/반품되는 식으로 흐릅니다. 각 단계는 행과 열로 설명할 수 있는 엔티티(고객, 제품, 송장, 결제, 직원, 위치 등)에 자연스럽게 맵핑됩니다.
관계형 설계는 교차 검증도 쉽게 합니다. 송장은 고객 없이는 존재할 수 없고, 배송 라인은 실제 제품을 참조해야 하며, 결제는 송장으로 연결되어야 합니다. ERP 시스템(재무, 조달, 재고)과 CRM(계정, 연락처, 영업기회, 지원 사례)은 이러한 “이것은 저것과 관계가 있어야 한다” 규칙을 활용해 팀 간 기록을 정렬합니다.
조직이 커지면서 선택지는 두 가지가 되었습니다:
어떤 접근이든 스키마가 명확하면 고객 ID, 제품 코드, 회계 차원 등을 동기화하기가 훨씬 쉬워져 수동 수정이 줄어듭니다.
ERP·CRM 공급업체가 관계형 기반에 수렴하면서 기업들은 스킬의 이식성을 얻었습니다. SQL을 아는 애널리스트를 고용하고 표준화된 보고서를 운영팀에 교육시키는 것이 전용 툴을 가르치는 것보다 훨씬 쉬워졌습니다.
이 표준화는 장기 비용을 낮췄습니다: 커스텀 데이터 추출이 줄고, 재사용 가능한 보고 패턴이 늘며, 관리자·컨설턴트·내부 팀 간 인수인계가 쉬워졌습니다. 많은 회사에서 이 점이 관계형 데이터베이스를 기술 선택에서 운영 기본값으로 만든 이유입니다.
관계형 데이터베이스가 승리한 이유는 데이터 모델링뿐 아니라 운영 환경에 적합했기 때문입니다. 초기부터 RDBMS 제품들은 정기 백업, 사용자 역할, 시스템 카탈로그, 로그 등 일관된 운영 루틴을 제공해 비즈니스 데이터를 안전하고 책임 있게 관리하기 쉽게 했습니다.
비즈니스 데이터베이스는 복구 가능성이 신뢰성의 핵심입니다. RDBMS 도구는 전체 백업, 증분 백업, 트랜잭션 로그를 이용한 시점 복구 같은 표준 방식을 제공했습니다. 이를 통해 팀은 복구 절차를 테스트하고 문서화하며 사고 발생 시 반복적으로 적용할 수 있었습니다—급여, 송장, 재고, 고객 기록에 특히 중요합니다.
모니터링도 운영의 일상이 되었습니다: 스토리지 성장, 느린 쿼리, 락 경합, 복제 상태 등을 추적합니다. 문제를 수치화하면 관리가 쉬워집니다.
대부분의 RDBMS 플랫폼은 접근 제어를 핵심 기능으로 제공합니다. 공유 비밀번호를 나눠주는 대신 관리자는 계정을 만들고 역할로 그룹화하여 데이터베이스, 테이블, 경우에 따라 행 수준까지 권한을 부여할 수 있습니다.
거버넌스의 두 가지 기본은 특히 중요합니다:
이 구조는 규정 준수를 지원하면서도 일상 작업을 과도한 예외 처리로 바꾸지 않습니다.
RDBMS의 감사(로그, 시스템 테이블, 내장 감사 기능)는 “누가 언제 무엇을 변경했는가?”에 답하는 데 도움을 줍니다. 이는 문제 해결, 보안 조사, 규제 워크플로에 유용합니다.
변경 측면에서는 성숙한 팀이 반복 가능한 마이그레이션: 버전 관리에 등록된 스크립트화된 스키마 변경을 사용하고, 이를 검토해 환경 전반에 일관되게 적용합니다. 승인과 롤백 계획을 결합하면 야간의 ‘즉석 수정’으로 보고나 통합이 조용히 손상되는 위험을 줄일 수 있습니다.
관리 관행은 기업들이 표준화할 수 있는 패턴으로 발전했습니다: 복제로 중복성 확보, 페일오버로 고가용성 실현, 그리고 전체 데이터센터(또는 클라우드 리전)를 잃는 상황을 가정한 재해복구 설계. 이런 운영적 구성요소들이 관계형 데이터베이스를 핵심 시스템의 안전한 기본값으로 만드는 데 기여했습니다.
클라우드 서비스는 관계형 데이터베이스를 대체한 것이 아니라, 운영 방식에 변화를 가져왔습니다. 서버를 사서 데이터베이스 소프트웨어를 설치하고 유지보수 일정을 계획하는 대신, 많은 기업이 운영 작업의 상당 부분을 제공자가 처리하는 관리형 RDBMS를 사용합니다.
관리형 관계형 데이터베이스는 자동 백업, 시점 복원(오류 발생 전으로 데이터베이스를 되돌리기), 패치 자동화, 모니터링 등을 제공합니다. 많은 비즈니스 앱에서 이는 야간 복구 연습을 줄이고 재해 계획을 예측 가능하게 만들었습니다.
스케일링도 더 유연해졌습니다. CPU, 메모리, 스토리지를 설정 몇 번으로 늘릴 수 있고 하드웨어 마이그레이션이 필요 없는 경우가 많습니다. 일부 플랫폼은 읽기 복제본을 지원해 보고 대시보드나 무거운 검색이 주문 입력이나 고객 지원을 느리게 하지 않도록 합니다.
복제는 데이터베이스의 복사본을 동기화 상태로 유지하는 것을 의미합니다. 고가용성은 복제를 이용해 다운타임을 줄입니다: 주(primary)가 실패하면 스탠바이가 인계받습니다. 결제, 배송 기록, 재고 업데이트를 계속 받아야 하는 시스템에서 이는 중요합니다.
기업이 글로벌 사용자를 대상으로 하면 지연(latency)이 실무상의 문제가 됩니다: 고객이 멀리 있을수록 요청 하나당 느리게 느껴질 수 있습니다. 동시에 마이크로서비스와 이벤트 기반 시스템은 하나의 ‘큰 앱’을 여러 작은 서비스로 나누어 각기 다른 데이터 요구와 릴리즈 주기를 갖게 합니다.
많은 팀은 핵심 기록(고객, 송장, 잔액)은 RDBMS에 두고 특정 작업을 위해 다른 도구를 추가합니다—빠른 텍스트 검색을 위한 검색 엔진, 속도를 위한 캐시, 대규모 리포팅을 위한 분석 웨어하우스 등. 이렇게 하면 데이터 무결성이 중요한 부분은 안전하게 유지하면서 성능과 통합 요구를 충족할 수 있습니다. 자세한 일관성 내용은 /blog/transactions-and-acid를 참조하세요.
실무에서는 플랫폼 예시로 Koder.ai 같은 도구가 “관계형 코어 + 최신 앱” 접근을 활용합니다: 채팅 인터페이스를 통해 웹 앱(React), 백엔드(Go), PostgreSQL 기반 시스템 오브 레코드를 빠르게 생성(vibe-code)하고 스냅샷과 롤백으로 스키마, 마이그레이션, 워크플로가 바뀔 때 안전하게 반복할 수 있게 해줍니다.
관계형 데이터베이스가 모든 워크로드에 완벽한 것은 아닙니다. 강점인 강한 구조, 일관성, 예측 가능한 규칙성은 데이터나 사용 패턴이 테이블에 잘 맞지 않을 때 제약이 될 수 있습니다.
몇몇 시나리오는 RDBMS 모델에 부정적으로 작용합니다:
NoSQL 시스템은 유연한 데이터 형태 저장과 수평 확장을 쉽게 해주기 때문에 인기를 얻었습니다. 많은 NoSQL은 일관성 보장이나 풍부한 질의 기능의 일부를 희생하고 분산, 빠른 쓰기, 스키마 진화의 용이성을 얻습니다—특정 제품, 분석 파이프라인, 고볼륨 이벤트 캡처에 유용합니다.
현대 비즈니스 스택은 다음과 같은 혼합을 사용합니다:
돈, 주문, 재고, 고객 계정처럼 명확한 규칙과 신뢰 가능한 업데이트가 필요한 것을 추적한다면 RDBMS는 보통 가장 안전한 출발점입니다. 트렌드 때문에가 아니라 실제 워크로드가 요구할 때 대안을 도입하세요.
비즈니스 소프트웨어에서는 고객, 주문, 송장, 결제, 재고 같은 항목에 대해 단일 진실의 원천이 필요합니다.
관계형 데이터베이스는 여러 사용자와 프로세스가 동시에 읽기/쓰기를 할 때도 기록을 일관되게 유지하도록 설계되어 있어 보고서와 실제 운영의 숫자가 맞아떨어지게 해줍니다.
관계형 데이터베이스는 테이블(행과 열)에 데이터를 저장하고 규칙을 적용합니다.
테이블은 키로 연결됩니다(예: Orders.CustomerID가 Customers.CustomerID를 참조). 이렇게 하면 관련 레코드를 복사하지 않고도 신뢰성 있게 연결할 수 있습니다.
파일 기반 저장소는 여러 부서가 같은 데이터를 필요로 할 때 한계가 있습니다.
일반적인 문제점:
**기본 키(Primary key)**는 행을 유니크하고 안정적으로 식별하는 값입니다(예: CustomerID).
**외래 키(Foreign key)**는 다른 테이블의 기본 키를 가리키는 필드입니다(예: Orders.CustomerID가 Customers.CustomerID를 참조).
이 둘을 통해 데이터를 신뢰성 있게 조인하고 ‘미스터리 링크’를 방지할 수 있습니다.
참조 무결성은 데이터베이스가 유효한 관계만 허용하도록 강제하는 것입니다.
실무적 이점:
정규화는 동일한 사실을 여러 곳에 저장하지 않도록 테이블을 설계하는 것입니다.
예: 고객의 주소를 Customers에 한 번만 저장하고 주문은 CustomerID로 참조하면, 주소 변경 시 한 번만 수정하면 되어 데이터 일관성이 유지됩니다.
SQL은 벤더와 도구가 달라도 공통의 방법으로 데이터를 조회할 수 있게 만들어 비즈니스 데이터를 질의 가능하게 했습니다.
일상적인 질문에 특히 강합니다(필터링, 그룹화, 조인):
트랜잭션은 여러 업데이트를 하나의 ‘모두 또는 전부 취소’ 단위로 묶는 것입니다.
주문 흐름에서는 주문 생성, 결제 기록, 재고 감소 같은 작업이 모두 하나의 트랜잭션에 들어갑니다. 중간에 실패하면 롤백되어 ‘결제만 되었지만 주문이 없는’ 상황 등을 방지합니다.
OLTP(Online Transaction Processing)는 대부분의 비즈니스 앱 패턴입니다: 많은 사용자가 작은 읽기/쓰기 작업을 빈번하게 수행합니다.
관계형 데이터베이스는 인덱스, 동시성 제어, 예측 가능한 쿼리 실행 등으로 이런 워크로드에 최적화되어 있어 결제, 송장 발행, 상태 업데이트 같은 핵심 작업이 일상 부하에서도 신뢰성 있게 동작합니다.
다음과 같은 경우 관계형 데이터베이스가 힘들 수 있습니다:
많은 팀은 RDBMS를 ‘시스템 오브 레코드’로 유지하고 검색, 캐시, 분석 등 특수 목적 저장소를 추가하는 하이브리드 접근을 사용합니다.