11줄 코드로 만드는 더 나은 SQL

2 weeks ago 24

UCLA RePL이 개발 중인 Prela는 데이터를 이항 관계로 표현하고 합성해, 20줄이 넘는 SQL 질의를 더 짧고 읽기 쉽게 작성함 넓은 테이블을 6NF 방식으로 분해해 각 열을 행 번호와 값의 쌍으로 바꾸고, 이항 관계를 여러 출력을 가질 수 있는 비결정적 함수처럼 다룸 관계를 잇는 .select, 속성을 묶는 &, 값을 거르는 .eq, 조건을 적용하는 .where가 핵심이며, 이 동작은 짧은 Python 코드로 구현 가능함 외래 키 ID를 행으로 해석하는 단계를 자동 삽입해 movie.s(company).s(country)를 “영화의 제작사의 국가”처럼 읽을 수 있고, 모든 하위 표현식을 독립된 질의나 CTE로 재사용할 수 있음 &는 여러 속성 선택과 조건의 논리곱을 모두 처리하며, 필터 뒤에 .select를 연결해 원하는 열을 반환하는 조합 가능한 질의 구조를 만듦 Prela의 질의 형태 Prela는 UCLA RePL에서 개발 중인 새 질의 언어로, SQL과 형태는 다르지만 소수의 연산자를 조합해 질의를 구성함 예시 질의는 미국 회사가 제작했고 제목에 등장인물 이름이 포함된 영화를 찾아, 영화 제목과 각 출연자의 별명을 반환함 movie.where(company.s(country).eq("[us]") & keyword.eq("character-name-in-title")) .select(title & cast.s(person).s(alias).s(text)) 이에 대응하는 SQL 질의는 20줄이 넘음 테이블을 이항 관계로 분해 Prela는 열이 두 개인 이항 관계(binary relation) 만 사용함 ID, title, year로 구성된 영화 테이블은 각 열을 행 번호와 값 사이의 관계로 분해함 movie = Rel([(646, 0), (478, 1), (583, 2)]) title = Rel([(0, "The Godfather"), (1, "Seven Samurai"), (2, "Casablanca")]) year = Rel([(0, 1972), (1, 1954), (2, 1942)]) movie, title, year는 각각 원래 테이블의 ID, title, year 열을 나타냄 title과 year에서는 행 번호가 첫 번째지만 movie에서는 두 번째임 이런 형태는 6NF 분해로도 알려져 있음 Prela는 CPS를 이용해 분해에 따른 간접 참조를 컴파일 과정에서 ...

Read Entire Article