DB에서 primary key는 항상 int, auto increment?

lacovnk의 이미지

1.candidate key를 사용하지 않고, 그냥 int autoincrement 필드를 두고 이를 primary key로 사용하는 것이 적절한가요?

예를들어 학번 같은 것을 직접 primary key사용하지 않고, 그냥 no라는 필드를 두는 것이지요.

2. 이렇게 하면 뭔가 장점이 있을 것 같은데.. (다른 형보다는 int가 DB내에서 index 구현이 더 최적화된더던가..) 맞나요?

3. 이렇게 하면, 실제 candidate key가 중복되지 않도록 app.에서 미리 체크를 해줘야 하는 압박이 있는데.. (미묘한 타이밍 문제도 생기고)
이를 DB단에서 해결할 방법은 있나요?

덧. 책을 빌린다는 것을 뭐라고 해야 하나요?

lend정도? rent? -o-;

dsh의 이미지

1. 학번 같은 데이터라면 그냥 pk로 쓰겠습니다.

2. 필드가 하나 늘겠죠.

3. unique constraint를 걸어둬야겠죠

lacovnk의 이미지

만일

A가 B에게서 C를 대여한 정보를 담으려는데,

그렇다면, key는 (A,B,C)가 되어버립니다.

이렇게 묶어서 pk로 하는 것보다는 no를 하나 두는 것이 나으려나요? app.차원에서 이런 경우를 더 생기지 않게 하는 것이 더 적절해보이기도 하고..

atie의 이미지

제시하신 학번이나,

Quote:
A가 B에게서 C를 대여한 정보를 담으려는데,
그렇다면, key는 (A,B,C)가 되어버립니다.

예는 적절하지 않는데 (이 경우는 pk와 fk가 될 듯 한데요.), 아무튼 질문하신데로 db가 지원하는 sys gen key라고 불리는 auto incremental key를 사용하는 것이 좋은 경우가 있습니다.
RequisitionID가 좋은 예인요 예를 들어
Dept-Seq-Year-split 식으로 복수개의 column이 pk가 된다면 이를 sys-gen-key를 하나 두고 처리를 하면 header에서 detail을 읽을 경우나, PO table에 갖다 넣고 쓸 때도 index 처리를 하나의 column으로 처리를 하니 속도 면에서 이득이 될 수 있습니다. 그렇지만 반면에 배치 업로드를 하는 경우는 레코드 별로 하나씩 해야한다는 단점도 있고, 리포트에는 원래 키들을 사용해야 한다(의미를 보여주기 위해서)는 등의 단점도 있습니다.
하나의 테이블에 하나의 pk를 갖는다는 원칙에 복수개의 컬럼을 pk로 쓰는 것보다는 하나의 컬럼을 pk 쓰는 것이 보통의 경우 편리하다 라는 생각이 적용이 되면 sys-gen-key를 쓰는 것이 좋습니다.

----
I paint objects as I think them, not as I see them.
atie's minipage

익명 사용자의 이미지

lacovnk wrote:
1.candidate key를 사용하지 않고, 그냥 int autoincrement 필드를 두고 이를 primary key로 사용하는 것이 적절한가요?

예를들어 학번 같은 것을 직접 primary key사용하지 않고, 그냥 no라는 필드를 두는 것이지요.

2. 이렇게 하면 뭔가 장점이 있을 것 같은데.. (다른 형보다는 int가 DB내에서 index 구현이 더 최적화된더던가..) 맞나요?

3. 이렇게 하면, 실제 candidate key가 중복되지 않도록 app.에서 미리 체크를 해줘야 하는 압박이 있는데.. (미묘한 타이밍 문제도 생기고)
이를 DB단에서 해결할 방법은 있나요?

덧. 책을 빌린다는 것을 뭐라고 해야 하나요?

lend정도? rent? -o-;

예전에 어느 책에서 본 바, '프라미어리 키는 절대 비즈니스적 의미를 갖게 하지 마라'는 원칙이 있더군요. 예컨대, 말씀하신 '학번'을 프라미어리 키로 사용할 경우, 그 학생이 재입학을 한다거나, 같은 학교 내에서 진학을 해서 학번이 변경되어도 이전 데이터와 연계가 되도록 시스템을 확장할 때 엄청난 비용을 치뤄야 하는 경우가 있습니다. 그리고 실제 도메인과 관련된 값을 pk로 사용하지 않을 경우에는 auto increment int 가 가장 무난한 형태겠지요.

검색이 필요하거나, 중복되어서는 안되는 등의 제한을 거는 것은 따로 인덱스를 생성하면 쉽게 해결되지요.

birdryoo의 이미지

사이트의 규모나 DB 성능을 잘 고려하시면 되겠습니다.
일반적으로 MySQL 일 경우 PK 는 10 바이트를 넘지 않는게 좋다라고 합니다.
PK 의 length 가 커져버리면 그만큼 성능에는 좋지 않습니다.
그래서 어찌보면 속편하게 int 타잎을 키로 잡아서 쓰는게 좋을때도 있지요.

그리고 당연히 중복의 가능성이 있는 데이터는 PK 로 잡지 않는것이 좋다라고는 이야기하는데, 조금 비약해서 이야기해보자면, auto_incremental 로 지정한 int(11) 역시 한계 수치인 20억 얼마의 수치를 넘어가면 중복된 키값(20억 얼마값)을 사용하게 됩니다.

그럴때 우리는 보통 이렇게 이야기하져. "내가 늙어 죽을때까지 20억까지 올라갈일은 없을거야!!!!" 라고. ~_~

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.