데이터베이스 추상화-과장되고 있습니까?


18

수많은 데이터베이스 추상화 계층에 노출 된 후 데이터에 액세스하기위한 자체 패러다임을 개발하는 모든 라이브러리의 요점이 무엇인지 궁금해졌습니다. 새로운 DAL을 선택하면 새로운 언어를 다시 배우는 것처럼 느껴집니다. 일반적으로 내가 원하는 것은 레이어가 이미 내 머리에 쓴 SQL 쿼리를 출력하도록 설득하는 것입니다.

그리고 그것은 사실 후에 가독성에 영향을 미치지 않습니다.

# Exhibit A:  A typical DAL
rows = db(db.ips_x_users.ip_addr == '127.0.0.1')
    .inner_join(db.ips_x_users.user_id == db.users.id)
    .select(order=(db.ips_x_users.last_seen, 'desc'), limit=10)

# Exhibit B:  Another typical DAL
rows = db.ips_x_users
    .join(db.users, on=db.ips_x_users.user_id == db.users.id)
    .filter(db.ips_x_users.ip_addr == '127.0.0.1')
    .select(sort=~db.ips_x_users, limit=10)

# Exhibit C:  A hypothetical DAL based on standard SQL syntax
rows = db('''SELECT * FROM ips_x_users
             INNER JOIN users ON
                 (ips_x_users.user_id = users.id)
             WHERE ips_x_users.ip_addr = ip
             ORDER BY last_seen DESC LIMIT 10''', ip='127.0.0.1')

표준 SQL 구문의 문제점은 무엇입니까? 그것은 특정 목적을 위해 만들어졌으며 그 목적에 아름답게 맞습니다. 어쩌면 그것은 나지만, 스 니펫 C는 처음 두 개보다 훨씬 쉽게 이해할 수 있습니다. 이름이 바뀐 키워드와 구문 트릭은 귀엽지 만, IMO는 바로 그것으로 인해 코더가 행을 더 쉽게 검색하지 못합니다.

이것은 아마 긴 호언 장담처럼 보였다, 그러나이 있다 여기 진짜 문제는. 모든 DAL은 시도되고 진정한 SQL을 파싱하는 대신 쿼리를위한 새로운 DSL을 발명하는 것처럼 보이므로 다른 구문을 사용하면 얻을 수있는 이점이 있거나 표준 SQL 구문의 결함이 있다는 것을 알아야합니다. 아무도 내가 여기서 내려다보고있는 것을 지적 할 수 있습니까?


2
표준 SQL의 가장 큰 문제는 데이터베이스에 특정한 많은 쿼리가 있다는 것입니다. "조인 된"쿼리를 가져 오는 프로세스와 마찬가지로 외부 조인 구문은 크게 다릅니다. 이것이 바로 DAL의 필요성입니다. 이제 DAL에서 사용하는 표준 SQL 변형이 여러 SQL 공급 업체의 바보 동기화를 처리하는 방법을 알고 있다면이를 환영 할 것입니다.
Berin Loritsch

답변:


10

일반적인 SQL 사용의 가장 근본적인 문제는 SQL 쿼리가 다른 언어로 구성된 문자열이라는 것입니다. 이것은 SQL 주입 및 기타 취약점과 WTF에서 비롯된 것입니다 (쿼리에 실제로 매개 변수가 없기 때문에 예제가 잘못 선택되었습니다).

다음 문제는 실제로 추론입니다. 코드에 SQL을 작성했다면 컴파일러는 아무것도 할 수 없습니다. 열 이름의 오타와 같은 오류는 런타임에만 나타납니다. 이것은 기본적으로 소스 코드에서 쿼리의 문자열 표현을 원하지 않지만 컴파일러가 정적으로 분석하여 모든 facepalm-bugs의 95 %를 방지 할 수있는 이유입니다.

관계형 데이터베이스를 언어 의미 및 프로그래밍 모델에 매핑하려고하면 마지막 문제가 발생합니다. RDBMS는 OOP (또는 탐색 데이터 검색)와 잘 어울리지 않습니다. 실제로,이 두 가지를 결합하는 것은 끔찍한 생각이지만 SQL 데이터베이스 (예 : ORM)에 대한 모든 객체 지향 DAL에 관한 것입니다. 그러나 이러한 모든 추상화 계층은 누출로 정죄됩니다. 나는 이것이 기본적으로 너무 많은 이유가 있다고 생각합니다. 당신이 그들과 함께 일하고, 결함이 있음을 보았고, 그것을 올바르게 수행하고 결국 실패하는 DAL을 작성하기 시작했습니다.

따라서 1 번과 2 번 문제는 SQL을 제거하는 DAL이 있음을 시사하지만 3 번 문제는 하나 (최소 OOP의 경우)를 갖는 직접적인 해결책이 없으므로 항상 다른 강점과 한계를 가진 DAL의 바다가있을 것이라는 것을 의미합니다. 결국, 당신이 할 수있는 일은 신중하게 몇 가지를 선택하고 고수하는 것입니다.


3
"RDBMS는 OOP와 잘 어울리지 않습니다"- 소프트웨어의 모든 것이 OO 여야합니까?
quant_dev

@quant_dev : 아뇨. 그러나 '추상'계층은 본질적으로 '추상 지향적'입니다. 또한 제공된 코드 스 니펫은 우리가 OO 코드에 대해 이야기하고 있다고 제안합니다.
back2dos

나는 항상 SQL을 C에 포함시키는 것이 가장 어리석은 일이라고 생각했습니다. 그런 식으로해야 할 때 테이블 간의 관계를 정의하고이를 데이터베이스에 저장 한 다음 관계를 사용하여 런타임시 SQL을 만들어 데이터베이스와 대화하는 방법을 만들었습니다. 내 C 코드는 "이 키를 사용하여이 엔티티 찾기", "변경 사항을 저장하십시오"입니다.

9

모든 데이터베이스 플랫폼이 동일한 SQL 구문을 허용하지는 않는다는 사실을 간과하고 있으므로 응용 프로그램 전체에 SQL 문을 포함시키는 것이 모든 데이터베이스 플랫폼에서 작동하지는 않습니다. 여러 데이터베이스 플랫폼을 지원해야하는 경우 이러한 SQL 문의 대부분 (모두는 아님)을 다시 생각해야합니다.


3
@Note-그러나 DAL은 완전한 SQL 파서를 가져야하고 특정 데이터베이스와 다른 자체 지원되는 방언을 가져야합니다. 그런 다음 적절한 데이터베이스 별 SQL 문을 생성하는 데있어 현재 복잡성이 있습니다. 예를 들어, LIMIT 키워드는 MySQL에서는 유효하지만 Oracle 또는 SQL Server에서는 유효하지 않습니다.
저스틴 케이브

2
이제 우리는 문제의 고기에 도달하고 있습니다. 비표준 메소드 이름 및 연산자 오버로드가 비표준 SQL 방언보다 우월한 것은 무엇입니까? SQL을 사용하는 것은 최소한 코더에게 프레임 워크를 배우기위한 친숙한 기초를 제공 할 것입니다.
자기 소개-이름을 생각하십시오

3
@Note to self : 아마도 SQL의 일부 방언으로 SQL 파서를 작성하고 그것을 다른 SQL 방언으로 번역하는 것보다 유창한 스타일의 API를 작성하는 것이 더 쉽기 때문일 것입니다.
Dean Harding

1
레코드의 경우 "네이티브"SQL을 사용하는 것이 좋습니다. 내 프로젝트의 대부분은 하나 이상의 데이터베이스를 지원할 필요가 없었기 때문에 문제가되지 않았습니다.
Dean Harding

3
네,하지만에 대해 실행하는 방법을 자주 당신은 코드를 작성 않습니다 - "당신은 모든 데이터베이스 플랫폼이 동일한 SQL 구문에 동의 함을 명백한 사실을 내려다 보이는" 어떤 데이터베이스? 일반적으로 DB 플랫폼은 상당한 투자이며 종종 변경되지 않습니다. 또한 알려진 유형의 데이터베이스에 대해 쿼리를 최적화하면 효율성이 크게 향상됩니다.
quant_dev

5

나는 SQL이 10 년 전과 같은 주요 변화를 겪고 있다고 생각합니다. 수동 작업 재치 SQL을 제거하고 더 높은 추상화 레벨로 가져 가려는 지속적인 시도가 있습니다. 몇 년 전 포인터와 수동 메모리 관리에서도 마찬가지였습니다.

현재 진행중인 작업이므로 여러 가지 다양한 접근 방식이 제안, 시도, 포기 및 통합되는 것을 볼 수 있습니다. 나는 당신이 매니페스트 자체를 원한다면 일반적인 접근 방식이나 산업 표준 전에 더 많은 것을 보게 될 것이라고 확신합니다.

응용 프로그램 코드로 작업 할 때 적용하는 패러다임과 동일한 수준에서 동일한 수준으로 데이터 액세스 코드를 조작 할 수있을 때 확실히 우위를 점합니다.

몇 마디로 단순화, 민첩성, 신속성, 이것이 목표입니다.


4

Joel은 10 년 전에 멋진 기사를 썼습니다 : 건축 우주 비행사들이 당신을 놀라게하지 마십시오

나는 그것이 사실이라고 생각합니다. 패턴을 찾았 기 때문에 자체 응용 프로그램에서 추상화 계층을 사용하고 있었고이 방법을 쉽게 사용할 수있었습니다. 그러나 내 DAL이었습니다. 소스 코드의 모든 한 줄 => 모든 권한을 알고있었습니다. 그러나 팀 / 프로젝트 외부의 사람에게는 해당 프레임 워크를 사용하지 않는 것이 좋습니다.

이와 같은 것을 사용하는 경우 구현 방법을 아는 것이 중요하므로 라이브러리 / 도구를 배우는 데 많은 시간을 소비해야합니다. 배울 시간이 없다면 사용하지 마십시오. 처음부터 매우 쉬워 보이더라도.


예, 과거에 근무했던 회사는 Hibernate를 열정적으로 사용하기 시작했습니다. 그런 다음 프레임 워크에서 생성 한 쿼리가 얼마나 놀라운 지 발견했습니다.
quant_dev

@quant_dev 예, 그것은 함정입니다-Hibernate 또는 JPA로 간단한 일을 시작하기 쉽습니다.
m5ba
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.