1 열 테이블이 좋은 디자인입니까? [닫은]


111

열이 하나만있는 테이블이 있어도 괜찮습니까? 기술적으로 불법이 아니라는 것을 알고 있지만 설계 불량으로 간주됩니까?

편집하다:

다음은 몇 가지 예입니다.

  • 50 개의 유효한 미국 주 코드가있는 테이블이 있지만 자세한 주 이름을 저장할 필요가 없습니다.
  • 이메일 블랙리스트.

누군가 키 필드 추가를 언급했습니다. 내가보기에이 단일 열이 기본 키가 될 것입니다.


열이 하나 뿐인 테이블의 사용 사례를 상상하는 데 약간의 어려움이 있습니다. 예를 들어 줄 수 있습니까?
Paul Morie 09-06-04

그러나 적어도 그것에 대한 인덱스를 만들지 마십시오!
Sathya

3
미국 주 코드는 도메인을 정의하는 전형적인 예입니다
Quassnoi

3
이전에 응용 프로그램에 대한 잠금 값을 유지하는 데 사용되는 데이터베이스 테이블을 보았습니다
Russ Cam

이 패턴에 대한 나의 용도는 데이터 세트를 만드는 것이 었습니다. 기본 테이블의 각 레코드에는 SET 필드가 있습니다. 동일한 SET의 레코드가 연결됩니다. 동일한 SET로 여러 레코드를 삽입하는 방법은 무엇입니까? 'INSERT INTO는 VALUES ()를 설정'한 다음 마지막 삽입 ID를 SET ID로 사용하여 레코드에 첨부합니다. 그런 다음 다시 UUID를 사용할 수 있었지만 뭔가 잘못된 느낌이 듭니다.
윌리엄 Entriken

답변:


87

예, 가장 효율적인 방식으로 테이블을 디자인하는 것은 확실히 좋은 디자인입니다. "Bad RDBMS Design"은 일반적으로 비 효율성에 중점을 둡니다.

그러나 단일 컬럼 설계의 대부분의 경우 추가 컬럼이 도움이 될 수 있음을 발견했습니다. 예를 들어 주 코드는 일반적으로 두 번째 열에 전체 주 이름을 입력 할 수 있습니다. 또는 블랙리스트에 노트가 연결되어있을 수 있습니다. 그러나 디자인에 실제로 해당 정보가 필요하지 않은 경우 단일 열을 사용하는 것이 좋습니다.


168

의 측면에서 relational algebra이 "의미하는 단항 관계 것 이 일이 존재합니다 "

예, 이러한 관계를 정의하는 테이블이 있어도 좋습니다. 예를 들어 도메인을 정의하는 경우입니다.

물론 이러한 테이블의 값은 자연스러운 기본 키 여야합니다.

의 룩업 테이블이 prime numbers가장 먼저 떠오르는 것입니다.


3
+1 : 테이블은 RDBMS의 기본 유형이되는 일련의 값입니다.
S.Lott

4
관계 이론을 기반으로 답변을 제공하는 경우 +1.
lubos hasko

여기에 자연 키, 메시징 시스템에서 스레드 테이블 ...이 아닌 1 열 테이블이 스키마의 좋은 예입니다 stackoverflow.com/a/6542556/45767
JeremyWeir

29

나는 과거에 그것들을 사용했습니다. 내 고객 중 한 명은 자신이 갖고있는이 큰 목록에있는 전화 번호로 가입하려는 사람을 자동 차단하기를 원했기 때문에 하나의 큰 블랙리스트에 불과했습니다.


19

타당한 필요가 있다면 문제가 없습니다. 어떤 이유로 든 표시 할 가능성 목록을 원하고 동적으로 변경할 수 있기를 원하지만 다른 테이블에 연결할 필요는 없습니다.



간결하고 명확한 답변을 원하면 +1합니다.
Matthew Jones

3
하나의 열 테이블을 다른 테이블에 연결할 수없는 이유는 무엇입니까?
Aheho

2
왜 안돼? 상태 코드 테이블을 예로 들어 보겠습니다. 주소 필드가있는 다른 테이블에 대한 외래 키 제약 조건으로 사용하지 않는 이유는 무엇입니까?
Aheho

1
그것은 좋은 생각이 될 때의 좋은 예입니다.
Kevin

11

가끔 발견 한 한 가지 사례는 다음과 같습니다.

countries_id 테이블 에는 각 국가에 대한 숫자 ID가있는 열이 하나만 있습니다.

countries_description 테이블 에는 국가 ID가있는 열, 언어 ID가있는 열 및 현지화 된 국가 이름이있는 열이 포함됩니다.

company_factories 테이블 에는 Wich의 국가를 포함하여 회사의 각 공장에 대한 정보가 포함되어 있습니다.

따라서 테이블에서 데이터 일관성 및 언어 독립적 데이터를 유지하기 위해 데이터베이스는 언어 종속성없이 외래 키를 허용하기 위해 단 하나의 열이있는 테이블이있는이 스키마를 사용합니다.

이 경우 하나의 열 테이블의 존재가 정당하다고 생각합니다.

댓글에 대한 응답으로 편집 됨 : Quassnoi


(출처 : ggpht.com )

이 스키마에서 테이블에 Language 열을 포함 할 필요가없는 company_factories 테이블에 외래 키를 정의 할 수 있지만, countries_id 테이블이없는 경우 외래 키를 정의하기 위해 테이블에 Language 열을 포함해야합니다. .


2
countries_id가있는 이유 국가를 삽입하려면 하나 이상의 언어로 된 국가 이름을 알아야합니다. 그러면 countries_description에 country_id가 표시됩니다. countries_description 항목이없는 country_id는 의미가 없습니다. "Mr. Barack Obama, COALESCE 사장 (14243, country_name) RETURNED NULL VALUE, 오늘 Россия 사장 Dmitry Medvedev를 만났습니다."
Quassnoi

4
@Doliveras : 좋아요, 이제 알겠습니다, +1. 그러나 coutry_code에는 ISO 3166-1을 사용하고 싶습니다. 숫자 ID와 달리 3 글자 국가 코드는 라틴 알파벳을 읽을 수있는 전 세계 거의 모든 사람에게 어떤 국가가 언급되는지 알 수 있습니다.
Quassnoi

동일한 테이블에 자연어 번역을 수용하기 위해 구현 한 또 다른 방법이 있습니다. 결과적으로 많은 필드가 null을 허용하지만 데이터 무결성을 사용자 지정 트리거로 오프로드 할 수 있습니다. CREATE TABLE "DBA". "myLocalisedTable"( "entry_id"INTEGER NOT NULL DEFAULT AUTOINCREMENT, "master_entry_id"INTEGER NULL, "master_entry_label"VARCHAR (200) NULL, "language_id"INTEGER NULL, "localised_entry_label"VARCHAR (300) NULL,
빈센트 벅

7

단일 열 테이블이 의미가있는 드문 경우가 있습니다. 유효한 언어 코드 목록이 외래 키로 사용되는 단일 열 테이블 인 데이터베이스를 만들었습니다. 코드 자체가 핵심이기 때문에 다른 키를 갖는 것은 의미가 없습니다. 그리고 언어 코드 설명이 일부 상황에 따라 언어별로 다르기 때문에 고정 된 설명이 없었습니다.

일반적으로 추가 속성이없는 신뢰할 수있는 값 목록이 필요한 경우에는 1 열 테이블에 적합합니다.


5

물론 앱 디자인이 이미 데이터베이스를 사용하는지 여부에 따라 항상 단일 열 테이블을 사용합니다. 데이터베이스 연결을 설정하는 설계 오버 헤드를 견디고 나면 가능한 모든 변경 가능한 데이터를 테이블에 넣습니다.

단일 열 테이블 OTMH의 두 가지 용도를 생각할 수 있습니다.

1) 데이터 항목이 있습니다. 드롭 다운 목록에서 자주 사용됩니다. 간단한 합법성 테스트에도 사용됩니다.

예 : 두 글자로 된 미국 주 약어; 우리가 배송하는 우편 번호 스크래블에서 합법적 인 단어; 기타

2) 희소 이진 속성, 즉 큰 테이블에서 매우 적은 수의 레코드에만 적용되는 이진 속성. 새 부울 열을 추가하는 대신 속성이 참인 레코드의 키를 포함하는 별도의 테이블을 만들 수 있습니다.

예 : 말기 질병이있는 직원; 360 일 연도의 은행 (대부분 365 사용) 기타

-알.



4

대부분 설명하신 상태 테이블과 같은 조회 유형 테이블에서 이것을 보았습니다. 그러나 이렇게하는 경우 고유성을 강제하기 위해 열을 기본 키로 설정해야합니다. 이 값을 고유하게 설정할 수없는 경우 하나의 열을 사용하지 않아야합니다.


여기에서 단일 열을 사용하는 것은 괜찮을 수 있지만 다른 열에도 고유성 제약 조건을 설정할 수 있습니다.
Stealth Rabbi

2

나는 일반적으로 그렇습니다. 하나의 열만 필요한 이유를 잘 모르겠습니다. 이것에 대한 몇 가지 예외는 내가 효과적으로 사용 된 것으로 보았습니다. 달성하려는 목표에 따라 다릅니다.

데이터베이스의 스키마를 생각할 때 정말 좋은 디자인은 아니지만 실제로는 유틸리티 테이블로만 사용해야합니다.

과거에 효과적으로 사용 된 숫자 테이블을 보았습니다 .


1

데이터베이스의 목적은 정보를 서로 연관시키는 것입니다. 관련 데이터가 없을 때 어떻게 할 수 있습니까?

아마도 이것이 어떤 종류의 컴파일 테이블 (예 : FirstName + LastName + Birthdate) 일 수도 있지만, 왜 그렇게 하려는지 잘 모르겠습니다.

편집 : 나는 일종의 간단한 목록을 위해 이런 종류의 테이블을 사용하는 것을 볼 수 있습니다. 그것이 당신이 그것을 사용하는 것입니까?


9
아니요, 데이터베이스의 주요 목적은 정보를 저장하는 것입니다.
Spencer Ruport

그러나 스프레드 시트는 정보를 저장할 수 있습니다. 그리고 서로 연관성이없는 일련의 분리 된 숫자와 문자 인 경우 정보가 어떻게 유용할까요?
Matthew Jones

이 정보는 데이터베이스를 사용하는 응용 프로그램에 필요 하고 고정 된 집합이 아니기 때문에 유용 할 수 있습니다 . 즉, DB는 관계형 또는 기타 데이터베이스 앱에서 사용할 정보를 입력하기에 가장 편리한 곳입니다. 우리가 관계 적 이상과 관련하여 우리의 순수성을 증명하기 위해 앱을 구축하지 않는다는 데 동의하실 것입니다. 대신 유용한 앱을 구축합니다.
Mark Brittingham

@Mark-이것이 제가 간단한 목록으로 의미하는 바입니다. 내가 내 자신을 잘 설명하지 못한 것 같아요.
Matthew Jones

1
@SR-아니요, 데이터베이스의 주요 목적은 정보를 검색하는 것입니다. 관심있는 행이 다른 데이터에 의존하지 않는 경우가 많기 때문에 MJ의 원래 의견이 의미한다고 생각합니다.
CurtainDog 2009-06-05

1

예, 말한대로 필드가 기본 키이면 가능합니다. 그 이유는 중복 데이터를 삽입하면 해당 행이 읽기 전용이기 때문입니다. 중복 된 행 중 하나를 삭제하려는 경우. 서버가 삭제할 행을 알지 못하기 때문에 작동하지 않습니다.


2
말도 안 돼. 기본 키 또는 제약 조건이없는 삭제 작업은 일치하는 모든 행을 무시하지 않고 삭제합니다.
Erik Funkenbusch

1
'작동 안함'은 "예상대로 작동하지 않음"을 의미 할 수 있으며, 이는 "행 하나를 삭제했지만 둘 다 사라졌습니다"라는 조건을 포함합니다.
GWLlosa

당신이 "테이블 열기"보기에서 SSMS에서 레코드를 삭제하려고하면 또는, 그것은 ... 실제로 레코드를 고유하게 식별 할 수있는 대화 상자를 던져 후 아무것도하지 않을 것이다
마이클 Fredrickson

-1

내가 생각할 수있는 유일한 사용 사례는 아마도 단어 게임을위한 단어 표입니다. 문자열이 단어인지 확인하기 위해 테이블에 액세스합니다. 단어 =? 인 단어에서 단어를 선택합니다. 그러나 관계형 데이터베이스 보다 단어 목록을 보관하는 데 훨씬 더 나은 데이터 구조가 있습니다.

그렇지 않으면 데이터베이스의 데이터는 일반적으로 데이터의 다양한 속성 간의 관계를 활용하기 위해 데이터베이스에 배치됩니다. 데이터에 가치 이상의 속성이없는 경우 이러한 관계는 어떻게 발전할까요?

따라서 불법은 아니지만 일반적으로 열이 하나만있는 테이블이 있으면 안됩니다.


이와 유사하게 반복을 중지하는 데 매우 유용한 숫자 표가 있습니다.
u07ch

-1

모든 테이블에는 4 개 이상의 기술 필드, 직렬 기본 키, 생성 및 수정 타임 스탬프, 소프트 삭제 부울이 있습니다. 블랙리스트에서 누가 항목을 추가했는지 알고 싶을 것입니다. 그래서 저에게 대답은 아니오입니다. 단 하나의 열만있는 테이블은 무언가를 프로토 타이핑 할 때를 제외하고는 의미가 없습니다.


1
데이터 테이블과 트랜잭션 테이블을 섞는 것 같습니다. 제 생각에는 이것들은 두 가지 별개의 것이어야합니다.
Josh Noe 2014

-2

네, 완벽합니다. 그러나 ID 필드는 그것을 다치게 할 수 없었습니까?


7
실제로 가능합니다. 유효한 값의 명확한 목록이있는 경우 원하는 마지막 항목은 값이 고유하지 않음을 의미하기 때문에 ID 필드입니다. '연한 파랑은'키가있는 경우에, 당신은 ID 1 '연한 파랑은'ID 4.와 '연한 파랑'에서 다를 수 있습니다 사람의 생각을 원하지 않는다
제레미 우르 큐

이드가 신분이어야한다고 누가 말 했나요? 아니면 열쇠의 일부?
Eric

3
합성 키일 수 있으며 원래 필드에 고유 한 제약 조건이있을 수 있습니다.
Mark Canlas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.