2017-10-17 1 views
4

먼저이 질문은 다소 주관적인 질문이지만 제 고객을 교육하는 데 도움이되는 공식 문서가 필요합니다.ID 값 하드 코딩을위한 SQL 모범 사례

배경 - 수백 개의 테이블과 SP가있는 대기업 응용 프로그램으로 모두 ID 테이블을 사용하여 정규화 된 테이블과 외래 키로 깔끔하게 설계되었습니다.

우리 고객은 우리의 생산 Db의 복제본을 사용하여 Crystal Enterprise에서 복잡한 보고서를 작성하는 직원이 있습니다.

회사의 사무실 위치 또는 부서 목록, 사용자의 표준 역할 집합, 다른 개체의 상태 (열기/닫기 등)를 '시스템'기본 정보로 분류하여 저장하는 표가 있습니다.), 기본적으로 자주 변경되지 않는 데이터입니다.

보고서 디자이너와 재무 분석가는 내부에 하드 코드 된 ID 값이 포함 된 쿼리를 작성하고 있습니다. 이 같은 것

나는 여기서 크게 단순화하고 있지만, 근본적으로 모든 장소의 하드 내부 코드 값을 사용하고있다.

SQL 개발자의 경우 이것을 보게되면 분명히 facepalm이이 작업을 수행하지 않기 때문에 내장 된 본능 일뿐입니다.

그러나 놀랍게도 난 이 작업을 수행해서는 안되는 문서 또는 모범 사례 문서를 찾을 수 없습니다.

그들은 값이 변하지 않기 때문에이 작업을 하는게 좋겠다고 주장 할 것입니다.하지만 단일 시스템 내에서 값이 변경되지는 않지만 여러 환경 (스테이징/QA/Dev)에서 변경 될 수 있습니다. 보고 설계 방식이 비 휴대용이 고 단 하나의 격리 된 서버 환경에서만 작동 할 수 있도록하는 방식이 절대적으로 다릅니다.

SQL 전문가는이 접근법을 피해야하는 이유에 대해 내 고객을 교육하는 데 사용할 수있는 더 자세한 정보/기사 등을 가지고 있습니까?

답변

3

보고서 작성자에게 가장 강력한 논쟁은 "환경 사이에서 그 값이 다를 수 있으며 절대적으로 다릅니다."라는 마지막 문장에서 두 번째로 보입니다. 그것은 그들에 대한 나의 반응의 요지 일 것입니다.

물론 모든 질문에는 항상 회색 영역이 있습니다. 본문 열은 본질적으로 magic numbers입니다. 그들은

  • 작은되는 데이터베이스에 혜택을 ...이
  • 순차 추구에 가입, 정렬 및

을 만들 ...하지만 단점을 가지고 빠른

  • 사실상 무작위로 할당 (삽입을 한 테이블에 정렬하면 다른 방법으로 정렬 한 것보다 행마다 다른 ID를 얻을 수 있습니다). 이와 같이 특정 특정 것을 찾아야하는 경우에는 일반적으로 "비즈니스/자연/대체"키 (예 : 어쩌면 (완전히 작성한 예) [CategoryName])를 포함하는 것이 일반적입니다. CatgoryName은 짧고 고유하며 인간입니다 읽는 동안.[CategoryId]은 신원이 있지만 찾아야하는 대상이 아닙니다.

    웹 사이트가있는 경우 드롭 다운 메뉴를 사용하여 일반적으로 자연 키가 드롭 다운의 보이는 부분에 들어가고 서로 게이트/신원 키가 최종 사용자에게 보이지 않게 백엔드에서 전달됩니다.

    사람들이 데이터베이스에 대해 직접 쿼리를 작성하는 경우 약간 번거로워집니다. 데이터 소유자 인 경우 더 큰 데이터 구조에 대한 정보를 알고 "기발한"방식으로 이점을 활용할 수 있습니다. 을 알면 키가 변경되지 않고 을 알고 있습니다. 그 값이 무엇인지 알기 만하면 해당 값을 참조하는 경우가있을 수 있습니다. 그러나 다시 말하지만, 다른 서버를 쿼리 할 때 다른 서버가 될 수는 없습니다.

    물론 ID 값을 사용하기를 원하지 않는다면 대안을 제시해야합니다. 테이블에 아직 비즈니스/자연/대체 키가 포함되어 있지 않으면 이미 존재하지 않는 테이블 하나를 추가해야합니다.

    또한 정수가되는 대체 키에도 아무런 문제가 없습니다 (어쩌면 이미 1, 2, 3 등 사무실에 회사 차원의 식별자가있을 수 있습니다). 그러나 요점은 어디에서 실행해도 결정적이라는 것입니다 당신의 질문.

  • +0

    좋은 대답입니다. 나는 그 모든 것에 동의합니다. 실제로 우리는 당신이 이미 묘사 한 바를 정확히 가지고 있습니다. 일치하는 ID/이름 쌍 쌍이 있습니다. 'Select Id from Category WHERE Name ='xxx ''를 변수로 사용하고 그 대신에 사용하는 것은 이해할 수없는 것입니다. 그러므로 거부합니다. 그래서 나는 그들을 지시 할 수있는 견고한 참조가 있기를 희망했습니다. 큰 권위자로부터 나는 이렇게 말할 수있다. 새로운 Azure VM을 가동하고 다른 테이블 값을 시드하고보고가 떨어져 버리는 반면 우리 앱은 그 점을 알기가 어렵습니다. – n4esa

    +0

    나는 주제에 대한 권위있는 기사가 부족하다는 것을 알았습니다. 정확하게 * 귀하의 질문이 아니지만이 게시물에도 좋은 답변이 있습니다. https://stackoverflow.com/questions/2001375/sql-avoiding-hard-coding-or-magic-numbers – Xedni