왜 테이블의 기본 키 열 "Id"를 명명하는 것이 나쁜 습관으로 간주됩니까? [닫은]


210

내 t-sql 교사는 PK 열 "Id"의 이름을 지정하는 것은 더 이상의 설명 없이는 나쁜 습관으로 간주됩니다.

테이블 PK 열 "Id"의 이름을 지정하는 것이 나쁜 습관으로 간주되는 이유는 무엇입니까?


27
글쎄, 그것은 실제로 설명이 아니며 Id는 "자신의 정체성"을 의미하며 이는 매우 자명합니다. 내 의견이다.
Jean-Philippe Leclerc

49
Id를 PK 이름으로 사용하는 상점이 많이 있다고 확신합니다. 개인적으로 TableId를 내 이름 지정 규칙으로 사용하지만 그 누구에게도 하나의 진정한 길을 말하지는 않습니다. 선생님이 자신의 의견을 널리 인정되는 모범 사례로 제시하려고하는 것 같습니다.

22
확실히 나쁘지 않은 나쁜 습관의 유형. 요점은 일관성을 유지하는 것입니다. id를 사용하는 경우 어디서나 사용하거나 사용하지 마십시오.
deadalnix

57
당신은 테이블을 가지고 있습니다. 그것은 People이라고 불립니다. 그것은 Id라고 불리는 열을 가지고 있습니다. 당신은 Id가 무엇이라고 생각합니까? 차? 보트? ... 사람 ID는 아닙니다. 나는 그것이 나쁜 습관이 아니라고 생각하고 ID 이외의 다른 이름을 PK 열에 지정할 필요가 없습니다.
jim

38
선생님이 수업을 마치고 한 가지 이유없이 이것이 나쁜 습관이라고 말씀하십니까? 선생님에게는 더 나쁜 연습입니다.
JeffO

답변:


247

나는 나와서 말할 것입니다 : 그것은 실제로 나쁜 습관이 아닙니다 (그렇더라도 그렇게 나쁜 것은 아닙니다 ).

Chad가 지적한 대로 다음 쿼리와 같이 오류를 마스크 할 수 있다고 주장 할 수 있습니다.

SELECT * 
    FROM cars car
    JOIN manufacturer mfg
        ON mfg.Id = car.ManufacturerId
    JOIN models mod
        ON mod.Id = car.ModelId
    JOIN colors col
        ON mfg.Id = car.ColorId

그러나 테이블 이름에 작은 별칭을 사용하지 않으면 쉽게 완화 할 수 있습니다.

SELECT * 
    FROM cars
    JOIN manufacturer
        ON manufacturer.Id = cars.ManufacturerId
    JOIN models
        ON models.Id = cars.ModelId
    JOIN colors
        ON manufacturer.Id = cars.ColorId

3 자 약어를 사용하는 항상 연습은 열 이름을 사용하는 것보다 훨씬 나빠 보입니다 id. (사례 : 실제로 테이블 이름 cars을 약어로 약칭하는 사람은 누구 car입니까? 그 끝은 무엇입니까?)

요점은 일관 적입니다. 회사에서 ID를 사용하고 일반적으로 위의 오류가 발생하면 전체 테이블 이름을 사용하는 습관을들이십시오. 회사에서 Id 열을 금지하는 경우이를 진지하게 취하고 원하는 명명 규칙을 사용하십시오.

이와 같은 문제를 다루지 않고 실제로는 나쁜 습관 (예 : 여러 개의 중첩 된 상관 하위 쿼리) 인 학습에 집중하십시오. 열의 이름을 "ID"로 지정하는 문제는 나쁜 습관보다는 맛의 문제에 더 가깝습니다.


편집자 주 :이 쿼리의 오류는 의도적 인 것이며 지적하는 데 사용됩니다. 편집하기 전에 전체 답변을 읽으십시오.


1
@ 차드, 그것은 특정 쿼리에서 의미가없는 경우에도 테이블 이름에 별칭으로 3 개의 문자를 사용했다는 사실에 대한 참조였습니다 ( cars-> car. 하느님 감사합니다-당신은 내 손가락을 구했습니다). 너무 깊게 읽지 마십시오.
riwalk

3
더 내 별명보다, 복수의 나의 혼합했다 carsmanufacturer. 하나는 복수이고 다른 하나는 그렇지 않습니다. 사람들이 DB에서 선택하기를 원한다면 그것은 나쁜 습관입니다.
CaffGeek

3
나는 그것이 나쁜 습관이라고 생각합니다. 분명히 나쁜 습관은 끔찍한 일이 아닙니다. 그러나 피하는 것이 너무 쉬운 이유는 무엇입니까? 이제, 소개 수업의 경우 이것이 초점을 맞추는 것입니까? 아마 ....
user606723

2
실제로 @ user606723은 인트로 클래스의 경우 중요한 점이라고 생각합니다. 모범 사례 교육은 기본적이어야합니다. 경험과 결과, 트레이드 오프를 이해하고 모범 사례에서 벗어나야 할 때가되어야합니다.
CaffGeek

5
@ 차드, 동의하지 않습니다. 학생들이 왜 모범 사례인지 이해하지 못하도록 "모범 사례"를 가르치려고하는 것은 무의미한 노력입니다. 그리고 당신이 모든 것을 다룰 수는 없기 때문에, "당신은 그것을하지 말아야하며, 왜 나중에 알아낼 것입니다"라고 교수님의 관점에서이 방법을 선택하는 것이 현명합니다. 호기심 많은 학생들이 여기에 게시하거나이 질문에 이미 답변이 되었기를 바랍니다. (또는 수업 후 요청)
user606723

123

외래 키가있는 테이블이 있으면 해당 외래 키의 이름을 "Id"로 지정할 수 없기 때문입니다. 테이블 이름이 TableId입니다.

그리고 당신의 조인은

SELECT * FROM cars c JOIN manufacturer m ON m.Id = c.ManufacturerId

이상적으로는 조건이 양쪽에서 동일한 필드 이름을 가져야합니다.

SELECT * FROM cars c JOIN manufacturer m ON m.ManufacturerId = c.ManufacturerId

따라서 Id의 이름을 ManufacturerId로 지정하는 것은 불필요한 것처럼 보이지만 실수가 분명 해짐에 따라 결합 조건에 오류가있을 가능성이 줄어 듭니다.

이것은 간단 해 보이지만 여러 테이블을 조인하면 실수를 할 가능성이 높아지고 아래 테이블을 찾으십시오.

SELECT * 
    FROM cars car 
    JOIN manufacturer mfg
        ON mfg.Id = car.ManufacturerId
    JOIN models mod
        ON mod.Id = car.ModelId
    JOIN colors col
        ON mfg.Id = car.ColorId

적절한 이름을 지정하면 오류가 발생합니다 ...

SELECT * 
    FROM cars car 
    JOIN manufacturer mfg
        ON mfg.ManufacturerId = car.ManufacturerId
    JOIN models mod
        ON mod.ModelId = car.ModelId
    JOIN colors col
        ON mfg.ManufacturerId = car.ColorId

ID의 이름을 "나쁜"것으로 지정하는 또 다른 이유는 여러 테이블에서 정보를 쿼리 할 때 ID 열의 이름을 바꿔야 구분할 수 있기 때문입니다.

SELECT   manufacturer.Id as 'ManufacturerId'
        ,cars.Id as 'CarId'
        --etc
    FROM cars 
    JOIN manufacturer
        ON manufacturer.Id = cars.Id

정확한 이름으로 이것은 문제가되지 않습니다


174
이것이 나에게 충분한 설명인지 확실하지 않습니다. 말하는 것에 아무런 문제가 없습니다 SELECT * FROM cars c JOIN manufacturer m ON manufacturer.Id = c.ManufacturerId. 나는 id몇 년 동안 사용해 왔으며 당신이 묘사 한 것을 실제 문제로 결코 찾지 못했습니다.
riwalk

61
여기서 나쁜 습관은 mfg 또는 mod와 같은 이름을 가진 테이블의 별칭을 지정하는 것입니다. manufacturer.id = cars.manufacturer_id는 매우 읽기 쉽고 오류도 발생합니다.
deadalnix

5
@Chad> 이미 바보 변수 이름에 문제가 있습니다. 여러 번. 기록을 위해 여기에 내가 팀에서 이것을하는 개발자에게 말할 것은«mfg는 제조업체를 의미하지 않습니다, 그것은 당신이 제조사를 늦게 입력해야한다는 것을 의미합니다».
deadalnix

9
@ Stargazer712 : 2 개의 테이블에서 SELECT *를 수행하면 2 개의 ID 열이 제공됩니다. ID가 모호합니다. 서수 또는 이름으로 참조하십니까? SELECT *도 좋은 습관이 아닙니다. 잘못된 주장. 깨지기 쉬운 코드. 차드는 정확합니다 : 기본적으로 방어 코딩
gbn

6
@gbn, 간단히 말하면, 모든 모호성은 사라집니다 SELECT manufacturer.id FROM .... 그로 인한 모든 어려움 id은 매우 쉽게 극복되어 단순히 맛의 문제가됩니다.
riwalk

67

Ruby의 ActiveRecord 라이브러리와 Groovy의 GORM은 기본적으로 서로 게이트 키에 "id"를 사용합니다. 나는이 연습을 좋아한다. 각 열 이름에 테이블 이름을 복제하면 중복되고 작성하기가 지루하며 읽기가 더 지루합니다.


30
"읽기 더 지루한"+1 -명명 규칙은 조잡한 코드에 대한 반창고로 생각되어서는 안되며, 가독성을 주요 관심사로 향상시켜야합니다.
ocodo

12
ID는 훨씬 지루합니다
HLGEM

5
@HLGEM : 항상 테이블 이름으로 열 이름을 한정 할 수 있습니다.
케빈 클라인

2
더 지루한 독서를 제외하고는 동의합니다. 나는 실제로 더 설명적인 열 이름을 읽고 해당 열이 실제로 무엇인지 알아내는 데 더 적은 시간을 소비하는 것을 선호합니다.
Devin Dixon

2
+1, Posts.postID, Posts.postName과 같은 열이있는 테이블을보고 증오하는 경우 post.id와 post.name을 사용하는 것이 훨씬 더 예쁘다.
Doug

40

"Name"또는 "Id"와 같은 공통 또는 키 열 이름 앞에 TableName을 붙여야합니다.

모호성을 제거하고 쉽게 검색 할 수 있으며 두 "Id"값이 모두 필요한 경우 열 별칭이 훨씬 적습니다.

덜 사용되거나 감사 열 또는 키가 아닌 것 (예 : LastUpdatedDateTime)은 중요하지 않습니다


57
당신이 이렇게하면, 내가 여분의 입력을 할 수 있도록 당신을 싫어 !!!! 테이블 이름은 Person입니다. ID가 어떻게 될 것이라고 생각하십니까? 차? 아니, 사람이야
jim

16
@ 짐, 나는 당신에 대해 모르겠지만 6 개의 추가 문자를 입력하면 약 0.5 초가 걸립니다. 그리고 하나의 테이블에서 거의 선택하지 않으므로 'Id'라는 두 개의 열로 끝나고 테이블 / 별칭 이름을 포함해야하므로 입력 한 문자 수를 절약 할 수 없습니다.
CaffGeek

21
@Chat 나는 그것을 불필요하다고 생각했다. 내가 조인을하고 있다면 c.id = m.manufacturerid는 괜찮습니다. 이 열은 일반적으로 클래스에 "매핑"되어 Person.PersonId 클래스를 사용하여 구토하고 싶습니다 ... 예, 문제가 있음을 완전히 알고 있습니다.
jim

20
나는 또한 이것에 동의하지 않습니다. 이유에서 중지 nameid? 모든 열에 테이블 이름이 접두사로 붙지 않는 이유는 무엇입니까? 접두사를 지정하기 위해이 두 이름을 선택하는 것은 임의적 인 것 같습니다. 개념적으로, 열의 컨텍스트를 가지려면 테이블이 있어야합니다. Person.Name, Animal.Name, Part.Name, ... 쿼리를 명확하게하기 위해 해당 테이블 이름을 사용하지 않는 이유
Thomas

11
@Bill Leeper, DRY는 데이터베이스 개발에 항상 적절한 것은 아닙니다. 데이터베이스에서 중요한 것은 성능이며 데이터베이스가 DRY 원칙을 완전히 채우도록 추가 작업을 수행하는 것 (예 : 스칼라 함수 또는 뷰를 호출하는 뷰 또는 쿼리를 호출하는 뷰 사용 또는 커서를 사용하여 기존 프로 시저를 사용하기 위해 1000000 개의 레코드 추가) 종종 금기입니다. 객체 지향 세계에서 뭔가 좋은 것이 데이터베이스 디자인에 적합하다고 생각하지 마십시오. 귀하의 공감 비가 부적절했습니다. ID 사용은 알려진 SQL 반 패턴입니다.
HLGEM

31

이 스레드는 죽었지 만 IMO 사용 하지 않는Id 것은 나쁜 습관 이라고 덧붙이고 싶습니다 . Id열은 특별하다; 그것은이다 기본 키. 모든 테이블에는 여러 개의 외래 키가있을 수 있지만 기본 키는 하나만있을 수 있습니다. 모든 기본 키가 호출되는 데이터베이스에서 테이블을 확인하자마자 기본 열이 어떤 열인지 정확히 알 수 있습니다.Id

나를 믿어, 지금 몇 달 동안 매일 많은 데이터베이스 (Salesforce)에서 일하면서 하루를 보냈고 스키마에 대해 말할 수있는 가장 좋은 것은 모든 테이블에 기본 키가 있다는 것 Id입니다. PK가 호출되기 때문에 기본 키를 외래 키에 조인하는 것에 대해 절대 혼란스러워하지 않을 것 Id입니다. 사람들이 언급하지 않은 또 다른 사항은 테이블이 길고 바보 같은 이름을 가질 수 있다는 것입니다 Table_ThatDoesGood_stuff__c. 그 이름은 건축가가 그 테이블을 생각한 아침에 숙취가 있었기 때문에 충분하지 않지만 이제는 기본 키를 호출하지 않는 것이 나쁜 습관이라고 말하고 있습니다 Table_ThatDoesGood_stuff__cId (SQL 열 이름은 일반적으로 대소 문자를 구분하지 않음을 기억하십시오).

솔직히 말해서, 컴퓨터 프로그래밍을 가르치는 대부분의 사람들이 가진 문제는 수년 동안 생산 코드 라인을 작성하지 않았으며 작동하는 소프트웨어 엔지니어가 실제로 무엇을하는지 전혀 모른다는 것입니다. 당신이 일을 시작할 때까지 기다렸다가 자신의 생각이 좋은 생각인지 아닌지 스스로 생각하십시오.


2
기본 키 중 어느 것도 복합 키가 아닌 경우에만 해당되며, 불행히도 너무 자주 발생합니다. 특정 상황에서는 대리 키만 사용해야합니다.
nicodemus13

6
그런 식으로 ID를 사용하면 개발자가 자신이 만드는 모든 테이블에 기본 키 ID를 추가하지 않아도됩니다. 관계형 데이터베이스의 기초 중 하나는 의미있는 전체 사용 및 기본 키 집계와 id 사용이 도움이되지 않는다는 것입니다.
피터 B

이 답변은 당신이 "논리를 선호합니다"라고 말하는 것처럼 보입니다. Id라는 키를 찾아서 어떤 키가 기본 키인지 즉시 알 수 있습니다. 글쎄, tableId와 동일 합니다. 어느 키가 기본 키인지 혼동하지 않도록 보장 할 수 있습니다. ID 앞에 테이블 이름이있는 것을 찾으십시오. 그뿐만 아니라 첫 번째 열이 기본 키가 아닌 곳에서 어떤 종류의 이교도 테이블을 사용하고 있습니까? 이 답변의 모든 주장은 순전히 우선이며 "tableId가 나에게 잘못 느끼는 것"과 유사합니다.
dallin

@dallin 모든 답변에 의견이 있습니다. 그렇지 않으면 누군가가 공식 표준에 링크 할 것입니다.
제임스

@James StackExchange 사이트의 목표는 의견이 많은 답변을 줄이는 것입니다. 그렇기 때문에 질문이 너무 의견이 많지 않아 문을 닫습니다. 물론, 저는 이것이이 질문이 종결 된 이유라고 생각합니다. 그것은 의견에 대한 답변을 이끌어 내기 때문입니다. 그러나이 구체적인 답변은 사실에 근거한 실제지지 사실이나 주장없이 지나치게 의견이 많았다 고 생각합니다. 전체 답변은 " 제 생각에는 Id를 사용해야합니다. 바로 그것이 내가 좋아하는 것입니다. " 그것은 귀중한 대답이 아닙니다.
달린

24

나는 그것이 나쁜 습관이라고 생각하지 않습니다. 평소와 같이 일관성은 왕입니다.

나는 그것이 맥락에 관한 것이라고 생각합니다. 표 자체의 맥락에서 "id"는 정확히 예상 한 것을 의미하며, 그렇지 않으면 동일하거나 다른 것처럼 보일 수있는 다른 라벨과 고유하게 식별하는 데 도움이되는 레이블입니다.

조인의 맥락에서 조인을 구성하여 귀하와 팀이 읽을 수 있도록하는 것은 귀하의 책임입니다. 잘못된 문구 나 이름을 지정하여 상황을 어렵게 만들 수있는 것처럼 별칭과 주석을 효과적으로 사용하여 의미있는 쿼리를 구성 할 수 있습니다.

'Foo'라는 Java 클래스에는 'Foo'라는 접두사가 붙지 않는 속성이 있으므로 테이블 ID 앞에 테이블 이름을 붙일 필요가 없습니다. 일반적으로 컨텍스트 에서 참조되는 ID가 무엇인지 명확 합니다.


5
관계형 데이터베이스 테이블 은 클래스가 아닙니다 .
Adam Robinson

1
그러나 데이터 구조이며 PODO 클래스와 유사합니다. 동일한 명명 문제가 적용됩니다.
ocodo

4
@Slomojo : 아니요. 단순한 객체와 유사하지 않습니다. 객체 지향 디자인과 데이터베이스 디자인은 동일하지 않으며 관련이 없습니다. 경우에 따라 유사한 (또는 동일한) 디자인을 생성 할 수 있지만 관련이 있음을 나타내지는 않습니다. 예를 들어, m : m 관계는 클래스에서 사소한 것이지만 세 번째 연관 테이블이없는 두 테이블 사이의 관계는 불가능합니다.
Adam Robinson

1
이것이 명명 전략과 어떻게 관련이 있는지 모르겠습니다. 내 비유는 (확실히?) 그 정도까지만 적용됩니다.
ocodo

2
내 암시 적 의미가 명확하지 않아서 미안하다. " 이런 의미에서 그것들은 수업과 유사하다 "고 말했을 것이다 . 어느 쪽이든, 나는 이것에 대해 지나치게 놀랄만하다고 생각하지 않습니다. 명명 측면에서, 테이블과 클래스는 상당한 양의 유사성을 공유합니다. 막 다른 골목에서 발전하는 모범 사례는 수정을위한 공정한 게임이거나 최소한 토론의 대상입니다. 이 Q & A에는이를 효과적으로 설명하는 내용이 많이 있습니다. 추가 할 사항이 없습니다.
ocodo

24

에서 data.stackexchange.com

게시물의 ID

붐, 질문에 대답했다.
이제 교사에게 나쁜 데이터베이스 디자인을 연습한다고 알려주십시오.


8
이름을 기반으로 FK에 대한 나의 추측 : PostTypeId -> PostTypes.Id; AcceptedAnswerId -> Answers.Id; OwnerUserId -> Users.Id. 왜 쉬운 습관을 '나쁜'것으로 간주해야합니까?
Sjoerd

3
이것이 모범 사례에 대해 정확히 어떻게 증명합니까?
GBa

5
무언가가 스택에 사용되는지 여부는 그것이 좋은지 나쁜지 증명하지 않습니다.
Pieter B

2
그것이 증명하는 것은이 관행이 결코 응용 프로그램의 확장 성과 유용성을 금지하지 않는다는 것입니다.
Cypher

1
실제로는 연습이 완벽하지 않습니다. 이 이름을 사용합니다 : PostType-> PostType.Id; AcceptedAnswer-> Answer.Id; OwnerUser-> User.Id
alpav

17

테이블에서 자연스러운 조인을 수행하기가 어렵고 혼란 스럽습니다. 그래서별로 나쁘지 않으면 나쁩니다.

자연 조인은 SQL Lore (예 : 관계형 대수)의 고대 유물이며 다음 중 하나를 보았을 것입니다. 내 말은 Natrual Join은 DBMS가 그것을 구현하는 데 영원히 걸리는 것처럼 보이지만 새로운 SQL 아이디어가 아니라는 것을 의미합니다. 따라서 그것을 구현하는 새로운 아이디어는 아닙니다. 오늘날의 존재.

기본 키의 ID를 모두 지정하면 자연스러운 조인의 간편함과 단순함을 잃게됩니다. 또는을 select * from dudes natural join cars작성해야합니다 . 자연스럽게 참여할 수 있다면 관계가 실제로 무엇인지 무시할 수 있습니다.select * from dudes inner join cars where cars.dudeid = dudes.idselect * from dudes inner join cars where dudes.carid = cars.id


응용 프로그램 개발자가 마지막으로 완전한 형식의 SQL 선택기를 작성한 마지막 시간 인 경우 스토어드 프로 시저를 작성하지 않는 한? 현대 언어에는 모두 이러한 관계를 관리하는 일종의 ORM 기능이 포함되어 있습니다. 열 이름은 깨끗한 수동 SQL을 작성하는 것보다 훨씬 중요합니다.
Bill Leeper

4
@Bill 나는 하루 종일 많은 시간을 할애하면서 개발중인 언어보다 코드베이스에 더 의존합니다. 또한 진단을 위해 선하고 깊은 관계를 맺고 싶다면 자연스럽게 조인을 묶고 필드 ID를 찾는 것을 완전히 피할 수 있습니다. 그리고 St. Jerome이 유명하게 말한 것처럼 "SQL의 무지는 데이터베이스에 대한 무지입니다".
피터 터너

자연 조인이 보편적으로 지원되지 않는다는 사실 외에도 IMO는 자연 조인을 읽기가 더 어렵습니다. 관계에 두 개의 열이 있습니까 아니면 하나의 열만 있습니까? 명시적이고 조인을 피하는 것이 훨씬 좋습니다.
Thomas

1
@Thomas, 코드에 자연 조인도 넣지 않았지만 진단을 위해 데이터베이스가 실제로 작동하도록 모델링 할 때 매우 유용하다는 것을 알았습니다.
피터 터너

16

모든 테이블에서 "ID"를 사용하는 것이 최선의 아이디어가 아닌 상황이 있습니다. USING키워드 (지원되는 경우). 우리는 MySQL에서 자주 사용합니다.

예를 들어 fooTablecolumn fooTableIdbarTableforeign key가 fooTableId있으면 쿼리를 다음과 같이 구성 할 수 있습니다.

SELECT fooTableId, fooField1, barField2 FROM fooTable INNER JOIN barTable USING (fooTableId)

그것은 타이핑을 절약 할뿐만 아니라 대안에 비해 훨씬 더 읽기 쉽다 :

SELECT fooTable.Id, fooField1, barField2 FROM fooTable INNER JOIN barTable ON (fooTable.Id = barTable.foTableId)

이것이 나를 위해 가장 두드러지는 답입니다. 이 USING키워드는 postgres / mysql / sqlite 데이터베이스에서 지원되며을 사용하는 이유로 다른 답변 중 일부를 나열하는 타이핑이 적다는 것을 의미 id하며 마침내 내 주관적인 의견으로는 더 읽기 쉽습니다.
Michael Barton

11

왜 선생님에게 물어 보지 않겠습니까?

모든 테이블 PK 열의 이름을 지정할 때 ID외래 키로 사용하면 악몽이됩니다.

열 이름은 의미 적으로 중요해야합니다. ID일반입니다.


8
무엇에 대해 너무 일반적인가요? 테이블의 id?
jim

3
@Jim 어느 테이블? id단독으로, 특히 다른 테이블에 대한 외래 키의 맥락에서 의미가 없습니다. 이것은 classes기본적인 기본 관계형 데이터베이스 설계 와 관련이 없으며 모든 것과 관련이 있습니다.

10
약간 치명적일 수있는 테이블. 필드 table.id를 참조 할 수있는 완벽하게 허용되는 방법입니다 id. 필드 이름 앞에 테이블 이름을 붙이면 중복됩니다.
ocodo

2
@ Slomoj 그것은 테이블에 이름을 괴물 조인의 단일 또는 이중 문자 약어로 앨리어싱 할 때 열에 이름을 포함시키는 것보다 더 타이핑하지 않습니다.

6
어떤 악몽을 언급하고 있습니까? 관리자를 나타내는 열이있는 직원의 자체 참조 구조가 있다고 가정하십시오. 외래 키를 뭐라고 부릅니까? 아마도 PK이므로 EmployeeId라고 부를 수 없습니다. FK의 이름이 PK와 일치하지 않아도됩니다. 포함 된 엔티티에 대해 나타내는 이름을 지정해야합니다.
Thomas

7

다음과 같은 이유로 ID가 잘못되었습니다.

많은보고 쿼리를 수행하는 경우 둘 다 표시하려면 항상 열의 별칭을 지정해야합니다. 따라서 처음에는 이름을 올바르게 지정할 수있는 시간 낭비가됩니다. 이 복잡한 쿼리는 불필요한 작업을 수행하는 추가 부담없이 충분히 어렵습니다 (수백 줄 길이의 쿼리 작성).

코드 오류가 발생할 수 있습니다. 자연 조인을 사용할 수있는 데이터베이스를 사용하는 경우 (내가 사용하지 않아야한다고 생각하지만 기능을 사용할 수있을 때 누군가가 사용할 것입니다) 그것을 사용하는 개발자가 있으면 잘못된 일에 참여하게됩니다.

복잡한 쿼리를 만들기 위해 조인을 복사하는 경우 별칭을 원하는 별칭으로 변경하고 잘못된 조인을 얻는 것을 잊어 버리기 쉽습니다. 각 ID의 이름이 테이블 이름을 따서 명명되면 일반적으로 구문 오류가 발생합니다. pPK 이름과 FK 이름이 일치하면 복잡한 쿼리의 조인이 잘못되었는지 쉽게 확인할 수 있습니다.


+1 : 제 생각에는 설득력있는 이유가 있습니다. 반대되는 다른 대답 ID은 전혀 설득력이 없습니다.
phoog 2016

다시 : "복잡한 쿼리를 만들기 위해 조인을 복사하는 경우"-문제는 복사 및 붙여 넣기입니다. 복사 및 붙여 넣기를 중지하면 car.id 명명이 얼마나 편리한 지 알 수 있습니다. FK 결합의 경우 car.mfg = mfg.id, car.color = color.id, car.model = model.id를 사용하십시오-매우 간단하며 LINQ에서 작성하는 것과 일치합니다.
alpav

30 조인으로 무언가를 작성하면 왜 반 패턴인지 알 수 있습니다.
HLGEM

앨리어싱이 가장 중요한 첫 번째 이유입니다. 큰 복잡한 보고서를 작성할 때 두통이 심합니다. 자연스러운 조인은 달콤한 보너스입니다. 다른 답변 이이 점을 어떻게 무시하는지 놀랍습니다. 몇 가지 예를 추가하면 요점이 명확 해지고이 대답을 원래 위치로 뛰어 넘을 것이라고 생각합니다.
Lulu

5

테이블에서 기본 키의 열 이름으로 "id"를 사용하지 않는 가장 중요한 이유 인 일관성 및 모호성 감소에 대한 몇 가지 대답이 있습니다.

그러나 유지 보수 프로그래머, 특히 원래 개발에 관여하지 않은 유지 보수 프로그래머는 주요 이점을 실현할 수 있습니다. Person 테이블의 ID에 "PersonID"라는 이름을 사용하고 해당 이름을 외래 키로 일관되게 사용한 경우 "PersonID"를 유추하지 않고 PersonID가있는 테이블을 찾기 위해 스키마에 대해 쿼리를 작성하는 것이 쉽지 않습니다. 외래 키일 때 사용되는 이름입니다. 옳고 그른 외래 관계가 모든 프로젝트에 항상 적용되는 것은 아닙니다.

하나의 테이블에 동일한 테이블에 대한 두 개의 외래 키가 필요할 수있는 가장 좋은 경우가 있지만이 경우 원래 키 이름을 열의 접미사 이름으로 지정하면 와일드 카드 일치 % PersonID를 쉽게 찾을 수 있습니다 그 경우도 마찬가지입니다.

예, "id"를 갖고 항상 "tableNameID"로 사용한다는 표준을 통해이 중 상당 부분을 달성 할 수 있습니다.하지만 실제로는 연습이 적절한 지 알고 있으며 원래 개발자에 따라 덜 수행해야합니다. 직관적 인 표준 연습.

일부 사람들은 더 긴 열 이름을 작성하기 위해 추가 키 입력이 필요하다고 지적했지만 코드 작성은 프로그램의 활성 수명의 작은 부분 일 뿐이라고 주장합니다. 개발자 키 입력을 저장하는 것이 목표라면 주석을 작성해서는 안됩니다.

수백 개의 테이블이있는 대규모 프로젝트를 유지 관리하는 데 오랜 세월을 보낸 사람으로서 테이블 전체의 키에 대해 일관된 이름을 선호합니다.


Companies테이블에 2 개의 외래 키가 있다고 가정 Persons합니다. 하나는 회사의 사장을 나타냅니다. 다른 하나는 회사의 재무를 나타냅니다. 당신은 정말 열 부를 것 PersonID1등을 PersonID2? 그것은 훨씬 더 많은 설명들을 호출하는 것 PresidentID등을 TreasurerID. inner join Person AS Presidents ON Company.PresidentID = Presidents.ID보다 읽기 가 더 쉽다는 것을 inner join Person AS Person1 ON Company.PersonID1 = Person1.PersonID
알았

1
제 귀하의 예제에서 나는 아마 것 CompanyOfficer또는 CompanyPerson사이에 다 대다 관계 수 있도록 테이블 CompanyPerson의 관계의 본질에 대한 추가 정보를. 나는 내에서 구현한다면 Company테이블, 나는 열 이름을 사용 PresidentPersonID하고 TreasurerPersonID추가 설명을 추가하는 동안 이름의 * PersonID 부분을 보존 할 수 있습니다. inner join Person as Presidents on Company.PresidentPersonID = Presidents.PersonID
말라기

5

기본 키 필드로 ID를 사용하면 모든 테이블에 ID가 추가됩니다. 많은 테이블에는 이미 레코드를 고유하게 식별하는 고유 정보가 있습니다. THAT를 기본 키로 사용하고 각 테이블에 추가하는 id 필드가 아닙니다. 이것이 관계형 데이터베이스의 기초 중 하나입니다.

그렇기 때문에 id를 사용하는 것이 나쁜 습관입니다. id는 종종 자동 증가 정보가 아닙니다.

다음 표를 고려하십시오.

PK id | Countryid   | Countryname
    1 |         840 | United States
    2 |         528 | the Netherlands

이 표의 문제점은 사용자가 다른 코드를 추가 할 수 있다는 것입니다. 물론 개별 열에 고유성을 적용하거나 이미 사용 가능한 기본 키를 사용할 수 있습니다.

PK Countryid   | Countryname
           840 | United States
           528 | the Netherlands

이렇게하면 관계형 데이터베이스 디자인의 핵심 인 기본 키로 이미 가지고있는 정보를 사용할 수 있습니다.


1
서로 다른 시스템간에 데이터베이스를 마이그레이션하거나 데이터베이스를 병합 할 때 사람들이 모든 테이블에 일반 키 열을 추가하는 이유를 이해할 수 있습니다.
Cypher

1
이것은 때때로 경우이지만, 내 경험상 멋진 고유의 불변 키를 갖는 것은 드문 일입니다. 그러나 귀하의 예에서도 국가를 식별하는 데 의미없는 고유 번호가 있으며 데이터베이스가 아닌 ISO로 할당 된 국가 만 있습니다.
코드 InChaos

이제 국가 이름이 변경되면 전체 데이터베이스에서 국가 이름을 업데이트하여 수정해야합니다. 단순히 대리 키 (예 : ""id ")를 사용한 경우 업데이트가 간단합니다. 자연 키는 완전히 불변하며 절대 변하지 않을 때 좋습니다. 이것이 사실 인 경우는 거의 없습니다.
Gerrat

@Gerrat : 국가 이름이 변경되면 ISO 3166-1 숫자 코드는 동일하게 유지되며 ISO 3166-1 alpha-2 및 alpha-3 코드 만 변경됩니다. 예를 들어 버마 / 미얀마에서 이런 일이 발생했습니다. 마찬가지로 국가가 영토를 변경하지만 이름을 유지하는 경우 ISO 3166-1 숫자 코드는 변경되지만 ISO 3166-1 alpha-2 및 alpha-3 코드는 유지됩니다. 이것은 남 수단이 수단에서 갈라졌고 에리트레아가 에티오피아에서 갈라 졌을 때 일어났다. 동독과 서독이 재결합했을 때, 그들은 서독의 알파 -2와 알파 -3 코드를 유지했지만 새로운 숫자 코드를 얻었습니다. 국가는 완전히 용해 또는 생각 (... 변환 할 때
요 르그 W MITTAG

… 90 년대 발칸 전쟁의 결과), 그들은 새로운 숫자와 알파 -2 그리고 알파 -3 코드를 얻습니다.
Jörg W Mittag

4

나는 항상 사용하는 프레임 워크 (Ruby on Rails, CakePHP)의 규칙이기 때문에 모든 테이블의 기본 열 이름으로 'id'를 사용하므로 항상 재정의 할 필요가 없습니다.

그것은 저에게 학문적 인 이유를 이길 수 없습니다.


2

제대로 사용하면 나쁜 습관이라고 생각하지 않습니다. "ID"라는 자동 증분 ID 필드를 사용하면 손대지 않아도되고 응용 프로그램에 대해보다 친숙한 식별자를 사용하는 것이 일반적입니다. 코드를 작성하는 것은 약간 번거로울 from tableA a inner join tableB b on a.id = b.a_id수 있지만 해당 코드를 숨길 수 있습니다.

개인적 선호로 ID 앞에 접두사 이름을 붙이는 경향이 있지만 Id데이터베이스가 완전히 처리 하는 경우 에만 실제 문제가 발생하지 않습니다 .


각 기본 키, 특히 자동 증가 ID로 두 개의 테이블을 결합하지 않습니다. 위의 샘플은 a.id = b.table_a_id의 tableA에서 내부 조인 테이블 B b입니다.
Bill Leeper

그래, 그게 내 뜻이야 거의 점심 시간에 에너지가 필요합니다.
Wayne Molina

2

ID는 충분히 일반적이므로 다른 사람을 혼란스럽게 생각하지 않습니다. 항상 테이블을 알고 싶을 것입니다. 테이블 / 별칭을 포함하지 않고 필드 이름을 프로덕션 코드에 넣는 것은 좋지 않습니다. 임시 쿼리를 신속하게 입력 할 수있는 것에 대해 너무 걱정이된다면 스스로해야합니다.

ID가 예약어 인 SQL 데이터베이스를 아무도 개발하지 않기를 바랍니다.

CREATE TABLE CAR (ID);

하나의 멋진 작은 2 문자 패키지에서 1부터 시작하여 필드 이름, 기본 키 및 자동 증분을 1 씩 처리합니다. 아, 그리고 그것을 CARS라고 불렀을 것입니다. 그러나 우리가 키 스트로크를 절약하고 누가 CAR이라는 테이블이 하나만 가질 것이라고 생각한다면?


1
이것은 공식 관계 이론에 대한 지식이 중요한 이유를 보여줍니다. 테이블 이름은 단일 행 이 무엇인지 나타냅니다 . 표 CarTable각각 Row이 단일을 나타내는 위치를 나타냅니다 Car. 호출 Cars은 의미 를 변경하고 공식적인 관계 이론 기본 원칙에 대한 완전한 이해가 부족함을 보여줍니다. Rails는 위험 할 정도로 충분히 알고있는 사람의 대표적인 예입니다 .

2

이 질문은 계속해서 되풀이되어 왔지만 저 역시 저의 의견을 추가 할 것이라고 생각했습니다.

  1. id를 사용하여 각 테이블의 식별자임을 의미하므로 테이블에 조인하고 기본 키가 필요할 때 자동으로 기본 키에 조인합니다.

  2. id 필드는 자동 증분이며 부호가 없습니다 (값을 설정할 필요가 없으며 음수가 될 수 없음을 의미)

  3. 외래 키의 경우 tablenameid (스타일 문제)를 사용하지만 결합하는 기본 키는 테이블의 id 필드이므로 일관성은 항상 쿼리를 쉽게 확인할 수 있음을 의미합니다.

  4. id도 짧고 달콤합니다

  5. 추가 규칙-모든 테이블 및 열 이름에 소문자를 사용하므로 대소 문자로 인한 문제가 없습니다.


1

고려해야 할 또 다른 사항은 기본 키 이름이 외래 키 이름과 다른 경우 특정 타사 도구를 사용할 수 없다는 것입니다.

예를 들어 Visio와 같은 도구에 스키마를로드하고 정확한 ERD를 생성 할 수 없습니다.


그것은 타사 도구의 잘못 일 것입니다. 열 이름 지정 규칙은 실제 외래 키를 대체하지 않으며 도구는이를 검사해야합니다.
Gerrat

1

여기서 사람들이 거의 모든 측면을 다루고 있지만 "id"는 "식별자"로 읽히지 않아야하며 "인덱스"로 읽혀서는 안된다고 덧붙이고 싶습니다. (여기서 잘못된 단어를 사용했을 수도 있습니다.

사람들이 테이블 데이터를 읽는 방법과 코드를 작성하는 방법은 어느 정도입니다. 나는 개인적으로 그리고 가장 많이 이것이 내가 가장 자주 보는 방법은 코더 table.id가 노조 또는 조인을 할 필요가 없더라도 전체 참조를로 쓰는 것 입니다. 예를 들면 다음과 같습니다.

SELECT cars.color, cars.model FROM cars WHERE cars.id = <some_var>

그렇게하면 "번호가 매겨진 자동차의 색상과 모델을 알려주십시오."로 영어로 번역 할 수 있습니다. "번호로 식별되는 자동차의 색상과 모델을 알려주십시오." ID는 어떤 식 으로든 차를 나타내지 않습니다. 차의 색인 일뿐입니다. 배열에서 세 번째 요소를 가져 오려는 경우와 같습니다.

그래서 내가 추가하고 싶은 것을 요약하면 그것은 단지 선호의 문제이며 설명 된 SQL 읽기 방법이 가장 인기가 있다는 것입니다.

그러나 ID가 실제로 설명하는 문자열 인 경우와 같이 사용되지 않는 경우가 있습니다 (훨씬 드문 예). 예를 들어 id = "RedFordMustang1970"또는 이와 유사한 것. 아이디어를 얻기 위해 적어도 이것을 설명 할 수 있기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.