Brad Urani – Rails anti-patterns: how not to design your database

바닥 : 이것은 더 큰 소리입니다 그러나 그것은 효과가 있었다! 그래서, 알다시피, 어떤 작품이든! 나는 너를 아주 좋아해야한다

내가 발표 할 것이 있기 때문에 안녕하세요, 제 이름은 앤드류입니다 그리고 저는이 회의를 서면 단어 나는 절대적으로 굉장하다, 나에게 라운드를 줘라 박수 갈채! [박수 갈채]

CAPTIONER : 감사합니다! 너는 끝내주게! 바닥 : 좋았어! 좋아요, 두 번이나 대화가 있습니다 휴식이 있습니다 그리고 우리는 한 번 더 이야기가 있습니다 그리고 마감 노트는 라몬과 필라가 다시 만나고, 그 다음에 애프터 파티가 있습니다 오늘 밤 8시

우리의 다음 연사는 Brad입니다 나는 그가 꽤 노래방이라고 들었다 가수, 바비큐 뉴스 공예, 그리고 기대하는 코더 그, 그리고 그는 그의 벨트 아래 Sequel과 15 년의 경험 다음 데이터베이스 도전에 착수하는 경우, 그는 그걸 돕는 것이 가장 좋습니다 – SQL

정말 큰소리로 말할 수도 있어요! 잘 지내! 구텐 태그! 내가 그것을 맞게 말 했니? 여기서 행복해하는 눈 비엔나 저는 2003 년에 로스 엔젤레스에서 비행기를 타고 왔습니다 나는 밖으로 날았다 어젯밤에 모두 너에게 말 했어 이것은 사랑 스럽다

시간, 주최자들, 그리고 나를 초대 한 사람들에게 감사드립니다 이리 제 이름은 당신이 우 라니입니다 나는 Procore에서 Al forria에서 일하는데, 이것은 데이터베이스 패턴에 관한 것이며, 관계형 안티 패턴, 레일 패턴 방지, 디자인하지 않는 방법 귀하의 데이터베이스 경고 : 어려운 결정

할거다 데이터베이스에서 사용할 수있는 패턴을 알려주지 만 이 일의 끝, 나는 너에게 단호하고 빠른 규칙을 줄 수 없다 정확히 어디서 사용할 지 잘하면 도구를 줄 것입니다 툴 벨트에 추가 할 수있는 새로운 것들, 시도 할 새로운 것들 궁극적으로, 하루가 끝날 때, 디자인 패턴은 어렵고, 귀하의 유스 케이스이므로, 이것의 끝, 아직도 선택이 있다는 것을 깨닫는다 만든

나는 Procore에서 일한다 Procore는 건축 산업 우리는 고층 건물을 짓는 사람들, 거인을위한 소프트웨어를 만듭니다 이런 건물 이것은 iPad 앱 중 하나의 예입니다

신사예요 그것을 사용하여 필드에 그것은 사람입니다 건설은 소프트웨어와 비슷한 문제를 가장 많이 가지고있다 사람들의 수는 남성이지만 우리는 건설 산업의 성별 다양성 증가

우리 에 대한 많은 레일즈 프로그램을 실제로 모델링했습니다 이 것은 레일즈 걸스와 같은 것들입니다 우리는 꽤 자랑 스럽다 우리는 Ruby 커뮤니티의 일부입니다 지난 2 년 동안 RailsConf의 후원자

[박수 갈채] 고마워요, 고맙습니다 우리는 아주 오래전에 SQL을 처리합니다 60 초 행이 스캔되었습니다 저지 시티의 Post GresConf에서이 이야기를했습니다

조차 그들은 그것에 깊은 인상을 받았습니다 50,000 건의 거래 숫자가 인상적인 숫자이며, 14TB의 데이터베이스와 함께 쓰고 있습니다 그건 우리가해야한다는 것을 의미합니다 SQL을 매우, 매우 진정 시켜라 데이터베이스 때문에, 아주 잘 아주 잘 데이터베이스의 영역에서 실수 디자인을 실행하면이 규모에서 비용을 지불 할 수 있습니다

이것은 우리의 오래된 사례입니다 우리는 지금 비용이 더 크다 새로운 페라리보다 이 데이터베이스를 악용 할 수는 없으며 우리가하는 모든 일은 매우 무거운 데이터베이스입니다 이것은 Procore의 예

그것은 건설 예산입니다 때를 이 페이지를로드하면됩니다 20 ~ 30 개의 SQL 쿼리 만 렌더링하면됩니다 페이지 그것은 고도로 튜닝 된 차동 SQL 퀴어입니다

에 빠른 속도와 페이지로드 속도를 빠르게 얻으려면 튜닝이 필요합니다 신중하게 올바른 패턴을 선택하고 성능에 총에, 뿐만 아니라 개발 – 개발자의 행복 문제 이 우리는 매우 큰 규모의 Rails 팀을 보유하고 있습니다 개발자, 수십 명의 레일 개발자 및 가장 큰 루비 앱 현재 루비는 2 백만 라인에 가깝기 때문에 그렇지 않습니다 SQL 문제는 있지만 Ruby on Rails 문제는 없다

우리의 도구는 루비 온 레일즈 (Ruby on Rails), 액티브 레코드 (Active Record) 뿐만 아니라 우리는해야만합니다 SQL 캐리와 잘 어울리는 올바른 패턴을 선택하십시오 빠르고 효율적이며 도구에 자연스럽게 맞아야합니다 세트

너는 코어 무덤 70sys와 함께 일한다는 것을 알고있다 역량, 능동적 인 기록 및 레일스 하자 반 패턴에 대해 이야기하십시오 오늘이 이야기는 내가 말할거야 당신은 두 가지 주요 안티 패턴에 대해

그들은 순진한 나무와 다형성의 관계입니다 첫째로, 작은 면책 조항 실제 안티 패턴은 없습니다 반 패턴은 사용하는 경우 반 패턴뿐입니다 그것이 최고의 선택 인 장소

모든 패턴에는 가장 좋은 패턴 인 경우, 심지어 내 오늘 내가 너에게 이야기 할 안티 패턴 유스 케이스에 잘 맞는 경우 최상의 선택 나무는 많은 데이터베이스에서 작업하기 매우 까다 롭습니다 사례 파일 시스템을 표현해야한다면 문서 관리 솔루션을 가지고 있다면 트리를 데이터베이스에 저장하십시오 다음은 파일 시스템 계층 구조의 예입니다

차트는 나무입니다 당신이 이런 종류의 것을 가지고 있다면, 어떤 종류의 이런 구조는 나무입니다 >>이 바보 같은 것들을 모두 얻을 수 있습니다 에 대해서도 마찬가지다 해커 뉴스, 누군가 레일 언급, 누군가가 말하고 자가 운전 자동차, 블록 사슬과 같은 전형적인 이야기

때때로, 당신은 소음을 걸러 낼 수 있다면 말이야 관계없이, 의견 실은 나무입니다 그리고 우리의 반 패턴은 순진한 나무입니다 가장 간단한 방법은 데이터베이스의 트리를 나타내는 것은 이와 같은 것입니다 기본 키 ID가 있습니다

외장 키 관리자 ID가 있습니다 이 경우 회사의 직원 인 경우 상사 인 관리자 ID, 관리자 및 매우 간단하게, 두 개의 기둥으로 우리는 바로 나무를 가지고 있습니다 이 매우 효율적입니다 그것은 아주 작은 공간을 사용합니다 가장 쉬운 방법입니다

트리를 표현하는 방법은 있지만 쿼리하는 것이 가장 어렵습니다 자, 할 수있는 일의 예를 들어 봅시다 구조가 있다면 자손을 원할 수도 있습니다 여기 우리는 폴리 호두 (Polly Walnuts)를 가지고 있으며, 그는 많은 자손을 가지고 있습니다

방법 이 순진한 트리에서 약간의 털이 많은 SQL이 필요합니다 어떻게해야합니까? 우리가 이걸 알아? 꼭대기에서 시작할 수 있죠? 우리는 합류하기 시작할 수 있습니다 한 사람이 있다면, 당신은 참여하고 모든 것을 얻을 수 있습니다 직접 아이들, 그 사람들의 아이들을 얻기 위해 또 다른 조인을 할 수 있습니다 권리? 문제는 빠르게 시작됩니다

너는 얼마나 많은 조인을하는지 모른다 이 경우, 당신은 트리의 모든 레벨에서 조인을해야하지만 시작할 때 쿼리, 당신은 얼마나 깊은 갈지 모르겠다 이것은 깨기 시작한다 당신이 자손을 구하려고하면 잘 작동하지 않습니다 귀하의 데이터베이스

우리는 그 밖에 무엇을 할 수 있습니까? 좋은 생각이 났어 우리 상단에서 시작할 수 있고, 상단에있는 사람이 다른 질의가있는 하위 노드와 다른 하위 질의가있는 자식 질문 이것은 또한 무너지기 시작합니다 이것은 n + 1 개의 검색어입니다 이것은 전형적인 일입니다

결국 너무 많은 쿼리를 수행하고 데이터 베이스 나는 추천하지 않는다 이 우리는 어떻게 우리의 데이터베이스에서 자손을 얻을 수 있습니까? 우리는 사용할 수 있습니다 재귀

나는 내가 찾을 수있는 가장 무서운 시도를 시도했다 우리 – 재귀 SQL 있음 아무도 그걸 쓰려고 애썼지? 그것은 짜증나 그렇지 않다 읽기 쉽고, 잘 지원되지 않는다

우리의 ORM, 특히 ActiveRecord와 같은 것들 성능 조정이 어렵습니다 많은 연기자가 있다면, 모든 사람들에게 글쓰기를 요청하십시오 재귀 적 SQL은이 테이블과 인터페이스 할 때도 마찬가지다 많이 물어보십시오 우리는 이것을하기 위해보다 간단하고 나은 방법이 필요합니다

사람들에게 발 기관총이 적은 패턴 이죠, 맞습니까? 다음은 재귀 적 요청의 예입니다 사실 : 사실 재귀 적이 아니며 반복적입니다 관계없이, 이것을 실행하는 최선의 방법은 아닙니다 앱 우리가 나무를 가지고있을 때 실행하는 또 다른 전형적인 소품은 우리가하려고하는 것입니다

사람들의 조상을 얻으십시오 우리가 맨 아래에서 시작하면 알피에 타 우리는 그의 매니저와 매니저를 찾고 싶다 이것은 또한 동일한 문제를 발생시킵니다 실제로 우리는 최종 결과와 함께 여기에 문제가 있습니다

말하자면, 하루의 끝, 나는하고 싶다 쿼리의 결과를 웹 페이지에 입력하십시오 그것은 마치 보일지도 모른다 이 중첩 된 글 머리 기호 목록 이것은 데이터가 아닌 방법입니다

SQL에서 다시 돌아올 때 모양이 나타납니다 SQL에서 돌아 왔을 때 테이블에 있습니다 재귀 SQL을 올바르게 작성해야하지만 결과를 트리로 렌더링하고 표시하는 재귀 이상적이지 않습니다 시간 낭비

우리는 아무것도 언급하지 않았다 여기가 잘못 됐어? 너는 나무가 있고 너는에서 주를 가지고가는 경우에 중간에, 당신은 모든 것을 다시해야합니다 – 모든 것을 되돌려 라 나무에 페이지 매기기를 시도한 사람이 있습니까? 그게 속임수 야? 빨리 분해되어 도착합니다 매우 복잡한 경우에 이러한 일을 처리하려고하면 더 좋은 패턴을 찾지 마라

다음은 거대한 재귀 쿼리의 예제입니다 이것은 나무 다 그 사본은 다른주기 탐지 중에 특징을 썼다 부모 A, 부모 C가있는 경우 SQL을 반복 할 수 있습니다 좋지 않아

때로는주기 감지 기능을 당신이 그런 것들을 다루는 경우 당신의 질문 내가 말했듯이, 안티 패턴 안티 – 항상 안티 패턴 그들은 심지어 좋은 유스 케이스 네가하는 일이 비교적 간단하다면 당신을 위해 일합니다 당신이 그것을 많이하지 않는다면, 그것은 좋을 수 있습니다

그것은 표현 표현 무결성을 가지고 있습니다 부모와 자식간에 외래 키 제약 조건을 적용 할 수 있다는 것을 의미합니다 그런 식으로 청렴한 태도를 취하십시오 디스크에서 효율적입니다 공간

자손이 필요하지 않은 경우, 조상 또는 재귀 SQL을 작성하고 결과, 당신은 이것으로 떠날지도 모르지만 그것은 당신을 위해 일할 수도 있습니다 그러나 복잡한 일을한다면 다른 방법이 있습니다 에이 Clojure tree는 다음과 같이 작동합니다 여기의 조직에서 this 우리의 파일 시스템 예제입니다 우리가하는 일은 매주마다 참고가있다

모든 자손의 부모 – 그 자손 아이들, 훌륭한 아이들 부모님 이 모양입니다 우선 기본 키 ID가 있습니다 부모 ID가 있습니다

이 경우 이름이지만 이거 전에, 그렇지? 이건 순진한 나무 야, ​​그치? 에서 이 외에도 우리가 추가하는 것은 이와 같은 테이블입니다 여기에있는 표에서 기본 키와 그 자손 하나 하나 – 자녀, 손자, 위대한 자 손자 우리는 Tony의 직접적인 지원뿐만 아니라 그들의 직접 보고서, 직접 보고서, 직접 보고서 이 테이블에는 우리 관계의 모든 관계에 대한 행이 있습니다 나무

그래서 내가 개념적으로 언급 한 이유는 보이는 군 최고의 파일에서 얻은 것뿐만 아니라 우리는 뿌리에서 한 줄을 얻었다 프랑스 2017 년까지의 사진으로 그 자체는 중요합니다 그러면 매우 간단 해집니다 우리가 뭔가를하고 싶다면 자손으로, 우리는 하나의 조인으로 그 모든 것을 할 수 있습니다

단일 마모 이것은 효율적이고 빠른 쿼리입니다 매우 빠릅니다 – 특히 색인 넣기 올바른 위치에 -이 경우 ancestor_id 해야 할 일 – 우리 SQL을 간소화 했으므로 개발자가 특히 더 큰 팀에서 처리하십시오 우리는 아주 좋아진다 이들 중 성능

조상을위한 단일 선택, 자손을위한 단일 선택, 형제 자매, 내가 이야기하지 않은 여러 가지 것들 모두 매우 빠르게 돌아 왔고 루비 보석이 있습니다 너도 알지? 클로저 트리라고합니다 그것 이 패턴을 구현합니다 그것은 많은 기능을 가지고 있으며, 마이그레이션을 작성하는 데 도움이됩니다 그것은 함께, 당신은 귀하의 Activerecord 모델에 추가 할 이것은 당신에게 이러한 훌륭한 방법을 제공합니다

모든 SQL은 당신을 위해 당신이 많이 쓰지 않아도 저장합니다 이런 일 그것은 당신에게 당신이 전체를 쓸 수있는이 같은 고급 것들을 제공합니다 돌연변이에서 하나의 쿼리로 트리의 다리가 빠릅니다 양육은 힘든 일입니다

그것은 노드를 삭제할 때입니다 트리의 가운데에있는 부모 ID를 업데이트해야합니다 그 밖의 모든 것 그것은 거래 적이며 올바른 일을합니다 너를위한 것들

빠르고, 참조 무결성입니다 그것은 당신이 넣을 수 있습니다 너의 참고에 외래 키 구속 결정 론적 주문에는 이전 도구가 포함되어 있습니다 나는 PG 경비원에 들어 가지 않을거야

또 다른 것이있다 대안 구체화 된 경로가 있으며 이는 다른 방법입니다 나무를 대표하다 그것은 closure tree와 비슷한 작업을하지만 약간의 작업을 수행합니다 다른

파일 시스템 예제를 다시 고려해보십시오 기본 키 ID를 입력하고이 경로 열을 가져 왔습니다 여기에 재미있는 부분 경로는 문자열, 텍스트, VAR char입니다 여기에는 슬래시로 구분 된 양식이 있습니다

모든 단일 엔티티의 전체 계층 구조를 참조 이 나무 그건 좀 이상해 보여? 우리는 계층 구조를 문자열로 나타냅니다 이상하게 들리 시죠? 처음 나는 이것을 보았다, 나는 농담하고 있었느냐? 그럴거야 권리 정말 효과가있는 것으로 밝혀졌습니다

믿거 나 말거나, Microsoft의 SQL Server는이 데이터를 트리 데이터로 사용합니다 유형 자손은 아주 쉽게됩니다 하나의 마모 조항을 가진 하나의 작은 쿼리, 그리고 이제 우리는 매우 빠르고 매우 빠른 자손 자, 우리 모두는 그것을 알고 있습니다

데이터베이스 성능을 수행 할 수있는 방법은 색인, 맞죠? 그래서 퀴즈를 터트려 라 경로에 색인이 있으면 할 수 있습니까? 이런 쿼리에 사용 하시겠습니까? 대답은 '예'입니다 오직 와일드 카드가 끝에 있습니다 시작 또는 중간에 와일드 카드를 넣을 수는 없지만 끝에 일치하면이 색인을 사용하여 룩업 (look-up), 이것이 그것이 왜곡 된 이유이며, 그것이 과거를 만드는 이유입니다 "조상"이라고 불리는이 보석이 있습니다

잘 가꾸어 진 그들은 새로운 관리자를 찾고 있습니다 그것은 준다 당신에게는 많은 것들이 있습니다 : 부모 방법, 조상, 자손, 이주 도구, 모든 종류의 것들 당신 깊이가 23 레벨 만 갈 수 있습니다

그게 당신 한테 문제가 될 수 있어요 그곳에 이 방법에 대한 큰 제한은 없습니다 참조 무결성이란 우리가 부모를 문자열로 나타내는 경우 외국어를 사용할 수 없습니다 해당 열에 대한 키 제약 조건이 있으므로 잠재적 인 게이트가 있습니다 실수, 프로그래머 오류로 인해 발생했습니다

조건, 그런 것들 그러나 이것은 빠릅니다 그래서 조금 성능 비교, 이것은 어떤 비가 블로그 게시물에서입니다 표준 Hillman, 작은 블로그 게시물 일반적으로 조상은 클로저 트리보다 빠릅니다 당신이 이것에서하고 싶은 많은 것들 그러나 특정 경우에 클로저 트리는 빠릅니다

당신이하는 일에 따라 더 빨리 달릴 수 있습니다 페이징하는거야? 삭제 하시겠습니까? 세고 있니? 만약 당신은 정말로 당신의 데이터베이스가 로드는 나무를 쿼리 할 때 성능이 우수합니다 작업 부하가 될 것입니다 쓰기 – 읽기 – 과중한 작업 부하에서 매우 어렵습니다 퍼포먼스가 최고 일이라면, 이것들을 선택해야합니다

사용중인 특정 작업 부하를 기반으로합니다 보통 초점을 맞 춥니 다 읽음 일반적으로 데이터는 한 번 쓰거나 읽습니다 쓰여진 것보다 더 많은 것을 보냅니다

그래서 당신은 읽기보다 쓰기가 쉬우나 작업 부하가 다를 수 있습니다 우리는 맨손으로 벤치 마크의 유스 케이스에 따라 다릅니다 그 나무를 덮는다 시간은 얼마나 남았습니까? 내가 어디 있니? 죄송합니다 괜찮아

그래서 우리를 반 패턴으로 데려옵니다 번호 2 : 다형성 관계 누가 알지? 이것은? 혹시 이것에 대해 들어 보셨습니까? 너는 모두 루비 레일이야 개발자 SQL을 10 년 동안 썼기 때문에 나는 이것을 말한다

루비를 처음으로 사용할 때까지이 패턴을 들었습니다 레일스, 그리고 처음으로 그것을 보았다, 나는 그 삑 소리와 같았다? 사람들은 무엇인가? 하기? 미니 테이블을 참조하는 외래 키가 있습니다 이것은 잘못된! 죽은 잘못! 죽은 잘못! 내가 틀렸어 그것은 실제로 유용하지만 오직 몇 가지 특정 사용 사례에 대해, 그리고 그것을 anti-pattern이라고 부릅니다 내가 고용하거나 사용하는 많은 시간 때문에, 그것은 잘못된 이유

그것은 유스 케이스를 위해 때때로 고용된다 네가 잘 지내지 못했을 때 나는 그것에 대해 이야기 할거야 잘 어울리고 좋은 곳도 있습니다 그래서, 이것에 익숙하지 않은 당신을 위해, 이것은 무엇입니까? 그것은 보인다 이것은 우리가 만난 예입니다

생산 사례 여기에는 3 개의 테이블이 있습니다 – 구매 주문서, 판매 주문 및 영수증과 같은 여기에 우리의 비즈니스 디자인에서 공통점이 있습니다 그들 중 하나를 나타내는 "광고 항목"이라는 것이 있습니다 페이지상의 선들, 그리고이 특별한 경우에, 광고 항목을 단일 표로 겹쳐서 우리가 칼럼을 가지고 있음을 의미하는 다형성 관계 홀더 ID, 부모 중 어느 하나의 ID에 대한 외래 키 저기서, 홀더 타입 홀더 유형은 다음과 같은 문자열입니다

할 것이다 구매 판매, 판매 주문 또는 영수증 중 하나 여야합니다 외국인 키 보유자는 세 개의 테이블 중 하나에 대한 외래 키이고 우리는 문자열과 홀더 타입에 기반을 둔 것을 알고 있습니다 알았어 실제로 데이터를 볼 때 이렇게 보입니다 당신 그 홀더 ID를 볼 수 있습니다

외래 키입니다 그러나 우리는 홀더 유형이 이상이기 때문에 어떤 테이블인지 알고 있어야합니다 그곳에 문제 : 좋은면에 대해 이야기 해 봅시다 그것은 내장되어있다

레일즈에 솔직히, 레일스에 내장되어 있다는 사실 그것은 당신을위한 최고의 선택 일 수 있습니다 이유 너는 없어 너무 많이 생각하는 것 당신이 그것을 할 수 있고, 아무도 당신이 그것을 사용한다면 당신을 잘못 할 것입니다

그것은 레일에 쉽고 내장되어 있기 때문입니다 그게 완벽합니다 그것이 당신에게 중요한 것이면 받아 들일 수 있습니다 그것은 또한 쉽다 더 많은 부모를 추가하십시오

이 사례 라인과 같은 것을 추가하면 항목을 만들었고 새로운 부모 유형을 추가하려고했습니다 그것들을 쉽게 추가 할 수 있습니다 새 테이블을 추가했지만 가지고 있지 않은 테이블 광고 항목 테이블을 변경하려면 새 값을 입력하십시오 추가 한 부모의 수에 관계없이 광고 항목은 동일하게 유지됩니다 당신에게 중요하다면, 당신에게 유용 할 수 있습니다

단점은 외래 키가 없다는 것입니다 실제로는, 당신이 사람들의 데이터를 다룰 때 정말로 중요합니다 금융 데이터 또는 의료 데이터 또는 당신은 절대 잘못 받아 들일 수 없습니다 고객에 대한 책임, 이 데이터가 누구에게 속해 있는지, 절대적으로 올바른지, 외래 키가 없다면 많은 문제를 일으킬 수 있습니다 그래서, 바로 거기, 그것을 사용하지 않는 것은 아주 좋은 이유입니다

그것이 앱과 고객에게 중요한 요소입니다 우리는 잃는다 우리가 이것을 할 때 우리 계단식 삭제 네가 가진다면 못생긴거야 다른 두 열의 조인을 수행하는 것과 같이 원시 SQL로 전환 할 수 있습니다

그것은보기 흉하게 생긴다 여분의 공간이 있다면 공간 효율적이지 않습니다 모든 행에 문자열 형 홀더가 있으면 많은 공간이 낭비됩니다 그게 대부분의 경우 큰 문제는 아니지만 상황에 따라 다를 수 있습니다 네가하는 일에

단점이 있습니다 무엇인가 대안 중 일부 는요? 별도의 테이블을 유지할 수 있습니다 권리? 이 경우, 아마도 최선의 선택은 별도의 구매 주문 광고 항목, 판매 주문 광고 항목 항목, 영수증 항목을 수정하고 이러한 모든 문제를 해결했습니다 우리 처음부터 이것을 했어야했다 여기서 오류는 그것을 건조하게하려는 유혹

그것을 하나의 테이블로 만들고 건조 시키자 그것, 그리고 그것은 오류로 밝혀졌다 이것은 단지 작동합니다 데이터를 보여줄 필요가 없습니다 같은 페이지에있는 세 개의 하위 테이블 이들은 분리되어있다

페이지 우리는 그런 것들을 결합 할 필요가 없습니다 많은 경우 나는 당신은 그렇습니다 제한된 경우에만 작동하지만 그렇지 않은 경우 모든 경우 그곳에서의 수업은 건조하지 않아도됩니다

괜찮아 그래서, 또 다른 대안은 배타적 인 아크들입니다 동일한 데이터를 나타냅니다 나는 약간 사용하려고한다 여기 다른 예제

이것은 소셜 미디어, 페이스 북의 예 소셜 미디어 사이트를 운영하고 있다고 가정 해 보겠습니다 당신은 사진을 가지고 있고 사람들은 사진에 대해 의견을 말할 수 있습니다 게시물이 있고 사람들이 초대장에 댓글을 쓸 수 있으며 게시물 사진이있는 ID, 초대장 ID 및 게시물 ID가 있습니다

우리는 세 가지가있다 부모 테이블 우리가 탁자를 볼 때 이렇게 보입니다 외래 키가 3 개 있습니다 각각의 경우에, 하나는 채워지고 두 개는 채워진다 그렇지 않습니다

그래서 장점은 여기 있습니다 외래 키를 가질 수 있습니다 강제 이제는 데이터베이스의 능력을 사용하여 상태가 올바른지 확인하십시오 실수는, 맞습니다

가능한 실수 코드에 버그가있을 수 있습니다 두 개의 외래 키를 채우지 만 두 개 이상의 외래 키를 채 웁니다 하나의 행 같은 줄에 하나 이상

제약 조건을 넣을 수 있습니다 대부분의 데이터베이스는 데이터베이스를 보호합니다 단점 중 하나 많은 인덱스가있을 수 있습니다 이 작업을 빨리 수행하려면 외래 키를 두십시오 – 당신은 외국에 인덱스를 두어야합니다 열쇠

너무 많으면 쿼리 속도가 느려집니다 그들은 읽기 속도를 늦추고 속도를 늦 춥니 다 다른 부모 유형, 당신은 많은 인덱스를 가질 수 있습니다 성능 병목 현상이됩니다 또 다른 방법은 base-parent라고하는 패턴입니다

표 부모 테이블에서, 당신은 이것에 주석 ID가 있습니다 측면 우리는 오른쪽으로 외래 키로 이동했습니다 그런 다음 중간에 "주석 처리 가능"테이블이 있습니다

그만큼 기본 키가있는 ID가 위에있는 키를 참조합니다 그 쪽 그런 다음 여기에 의견이 있습니다 잘 봐봐 우리는 주석으로 된 메시지와 코멘트 주석문의 메시지는 사진, 게시물 또는 초대장

우리는 이것에 대해 깨달았습니다 여기 오른쪽 모두가 메시지를 필요로하므로 우리는로 이동할 수 있습니다 센터의 테이블 실제 댓글에는 저기서 사는 메시지입니다 우리가 한 일은 상속의 데이터베이스 상응하는, 그래서 추출 공통 필드를 선택하고 주석 달기 테이블에 예를 들어 특정 페이지에서 귀하를 구할 수있는 당신 주석 처리 할 수있는 항목을 렌더링해야 할 수도 있습니다

이쪽에서 물건을 쿼리 할 필요가 없을 수도 있습니다 네가하는 일에 따라 그건 그렇고, 그것은 하나를위한 것입니다 책임이있는 각 코멘트에 대해, 우리는 하나를 가지고 있습니다 왜냐하면 그들은 모두 많은 의견을 가질 수 있기 때문입니다

이점은 그것은 건조한 시도입니다 이 경우, 그것은 좋은 종류의 건조한 것입니다 그만큼 단점은 두 가지 조인이 있다는 것입니다 데이터베이스는 매우 조인시 빠르다 아마, 아마도 그렇지 않을 수도있는 올바른 인덱스를 가지고 있다면 병목 현상이 발생할 수도 있지만 조심해야합니다

하나의 단점,이 방법에서 오른쪽으로 이동하는 것이 쉽습니다 좌로, 왼쪽에서 오른쪽으로 반대 방향으로 가기가 어렵습니다 가입 방식에 따라 한정 오류는 여전히 가능합니다 아무도 그것을 어떻게 보나요? 이걸 망쳐 버릴 수있어? 글쎄, 당신은 같은 주석이 달린 ID를 더 많이 가질 수 있습니다

이 테이블 중 하나는 오른쪽에 있지만 이상한 버그 일 것입니다 그것은 가능성이 없습니다 대부분의 경우이 방법이 더 안전합니다 그래서, 여기에서 다시 요약 해 보겠습니다 그렇다면 지금 가지고있는 것이기 때문에 실제로 선택을하십시오

우리는 이러한 결정을 내려야합니다 우리 툴 벨트에 몇 가지 패턴이 있습니다 가능한 수십 명의 부모가있는 경우 유형이므로 프로 코어 (Procore)의 사례입니다 변경 추적 테이블 그래서, 그것이 의미하는 것은 우리가 가지고있는 것입니다 수십 개의 테이블이 있고 그 중 하나가 변경 될 때마다 변경 테이블에 항목을 작성하십시오

즉, 수십 가지의 가능한 상위 유형을 의미합니다 실제로 수백 명이고 매일 성장하는 경우 – 어떻게해야할까요? 관계? 이 경우 가장 좋은 선택은 무엇입니까? 어떤 추측 해? 다형성 관계 그것이 바로 정말, 정말 빛난다 증가하는 부모 수 – 부모 유형 간단하고 대부분 안전합니다

그것은 레일에 내장되어 있습니다 죄송합니다 우리에게 효과가 없습니까? 우리가 경건한 성실함을 원한다면, 외래 키 제약 조건, 우리는 부모가 거의없고 독점적 인 호가 작동합니다 정말로 잘, 당신이 외국을 위해 다른 열쇠를 가지고있는 곳 부모 유형 공유 필드가 많은 경우 기능성, 우리 부모에게 공통적 인 캡슐화 테이블, 그리고 우리 좋은 외래 키 제약 조건, 기본 부모 테이블을 원한다

정말 잘 작동합니다 주석이있는 예입니다 언제나처럼, 귀하의 마일리지가 다를 수 있습니다 여기에는 많은 트레이드 오프가 있습니다 성능 및 단순성

경우에 따라 실적이 모두 어떤 경우에는 인간 공학과 경험이 더 중요합니다 정확성의 경우가 있습니다 이 경우에는 참조 무결성을 갖는 것과 마찬가지로 핵심 데이터베이스를 사용하여 비즈니스 규칙을 적용 할 수있는 키 제약 조건은 편리함을 희생한다 같은 다형성 관계를 좋아하는 레일 프레임 워크는 정말 사용하기 쉽습니다

당신 하루가 끝날 때 선택권이있다 그리고 당신은 귀하의 유스 케이스에 가장 적합한 선택 좋은 선택을하십시오 당신에게 가장 명백한 패턴이 아닐 수도 있음을 깨달으십시오 당신의 가장 좋은 것, 그것이 나무이든, 또는이 다른 종류의 관계에 여러 가지 좋은 방법이 있다는 관계 당신이하는 방식에 달려 있습니다

축하해 재귀 적 SQL 지옥은 피했다 거기에 몇 권의 책 나무와 계층 구조, 답답한 페이지 터너 통과하기가 어렵습니다

저자에게는 경멸하지 마십시오 그 훌륭하고 완전하다 이것은 더 읽기 쉽습니다 당신이 할 수있는 한 표지에서 표지까지 읽으십시오 나는 그것을 즐겼다

이 유형의 반 패턴 Bill Carwin은 향기가납니다 나는 브래드 우라 니입니다 나는 산타 바바라에서 일하고, Procore에서 아름다운 남부 완벽한 날씨와 산불로 가득 찬 캘리포니아 그 순간 오 세상에, 우리를 위해 기도해! 이것은에서 볼 수 있습니다 사무실

우리는 모든 종류의 규칙 (Ruby, Android, DevOps, 기계 학습, 그것 모두 물개, 햇빛, 그리고 상어! [웃음] [박수 갈채] 바닥 : 슈퍼 무서운! 슬로우 모션 걷기! 앤드류에게 또 하나의 박수 갈채가 빨리

따라 다니기가 어려웠습니다 [박수 갈채] CAPTIONER : 감사합니다! 바닥 : 알다시피, 나는 질문을받을 때 사랑한다 노트북? "그걸로 알게 될거야, 그건 내 신경을 진정 나는 브래드가 랩탑으로 걸어 갔다고 생각해

나는 그것이 랩탑이라고 확신하지 못한다! 노트북이없는 경우가 있습니다 [박수 갈채] 그것은 흥미 롭다 Sherlock-y의 일종 이 이야기가 끝난 후 우리는 작은 휴식을 취하고, 나는 모두를 원한다

반나절 네시 반, 네, 오늘의 마지막 이야기를 위해, 그리고, 그 후, 작은