1列のテーブルは良いデザインですか?[閉まっている]


111

列が1つだけのテーブルがあってもよろしいですか?技術的に違法ではないことは知っていますが、デザインが悪いと考えられますか?

編集:

以下にいくつかの例を示します。

  • 50の有効な米国の州コードを持つテーブルがありますが、詳細な州名を格納する必要はありません。
  • メールのブラックリスト。

キーフィールドの追加について誰かが言及しました。私の見たところ、この単一の列が主キーになります。


列が1つだけのテーブルのユースケースを想像するのに少し問題があります。例を挙げていただけますか?
ポール・森江

ただし、少なくともインデックスを作成しないでください。
サティア

3
米国の州コードはドメインを定義する古典的な例です
Quassnoi

3
以前にアプリケーションのロック値を保持するために使用されるデータベーステーブルを見たことがある
Russ Cam

このパターンを使用して、データのセットを作成しました。メインテーブルの各レコードには、SETフィールドがあります。同じSETを持つレコードが接続されます。同じSETで複数のレコードをどのように挿入しますか?'INSERT INTO sets VALUES()'そして、最後の挿入IDをレコードに添付するSET IDとして使用します。繰り返しになりますが、UUIDを使用できたかもしれませんが、何かが間違っているように感じます。
William Entriken 2012年

回答:


87

はい、テーブルを最も効率的な方法で設計することは確かに良い設計です。「不良RDBMS設計」は通常、非効率性が中心です。

ただし、シングルカラム設計のほとんどの場合、追加のカラムを使用するとメリットがあることがわかりました。たとえば、州のコードでは、通常、2番目の列に州のフルネームを綴ることができます。または、ブラックリストにメモを関連付けることができます。しかし、デザインが実際にその情報を必要としない場合は、単一の列があってもまったく問題ありません。


168

これに関してはrelational algebra、「このことが存在する」という意味の単項関係になります」。

はい、そのような関係を定義するテーブルがあれば問題ありません。たとえば、ドメインを定義します。

もちろん、このようなテーブルの値は自然な主キーでなければなりません。

prime numbers最初に頭に浮かぶのは、ルックアップテーブルです。


3
+1:テーブルは、たまたまRDBMSのプリミティブ型である値のセットです。
S.Lott、2009年

4
+1は、関係理論に基づいて回答を提供します。
lubos hasko 2009

ここでは自然キー、メッセージングシステム内のスレッドのテーブル...ではない1列の表があるスキーマの良い例だstackoverflow.com/a/6542556/45767を
JeremyWeir

29

過去に使ったことがあります。私のクライアントの1人は、この大きなリストにある電話番号で登録しようとするユーザーを自動ブロックしたかったので、1つの大きなブラックリストにすぎませんでした。


19

正当なニーズがある場合、問題は発生しません。たぶん、何らかの理由で表示する可能性のあるリストが必要で、動的に変更できるようにしたいが、別のテーブルにリンクする必要がない場合があります。


1 -ボトムライン、これは私の本の中で正しい答えである
マークBrittingham

+1は簡潔で明確な回答です。
マシュージョーンズ、

3
1つの列のテーブルを別のテーブルにリンクできないのはなぜですか?
Aheho

2
何故なの?例として状態コード表を取り上げます。なぜ、それを住所フィールドを持つ別のテーブルに対する外部キー制約として使用しないのですか?
Aheho

1
これは、良いアイデアになる時代の良い例です。
ケビン

11

私が時々見つけた1つのケースは次のようなものです:

テーブルcountries_idには、国ごとに数値IDを持つ列が1つだけ含まれています。

テーブルcountries_descriptionには、国IDの列、言語IDの列、ローカライズされた国名の列が含まれています。

テーブルcompany_factoriesには、Wichにある国を含む、会社の各工場の情報が含まれています。

したがって、テーブル内のデータの一貫性と言語に依存しないデータを維持するために、データベースはこのスキーマを1列のみのテーブルで使用し、言語に依存せずに外部キーを許可します。

この場合、1つの列テーブルの存在が正当化されると思います。

へのコメントに応じて編集: Quassnoi


(ソース:ggpht.com

このスキーマでは、company_factoriesテーブルに外部キーを定義できますが、テーブルにLanguage列を含める必要はありませんが、countries_idテーブルがない場合は、外部キーを定義するためにテーブルにLanguage列を含める必要があります。


2
なぜcountries_idがあるのですか?国を挿入するには、国名を少なくとも1つの言語で知っている必要があります。これにより、country_idがcountrys_descriptionに表示されます。countrys_descriptionエントリのないcountry_idは意味がありません。「COALESCE(14243、country_name)社長バラクオバマ氏がNULL VALUEを返しました。本日、Россия社長のドミトリーメドベージェフと会見しました」
Quassnoi

4
@Doliveras:はい、わかりました、+ 1。ただし、coutry_codeにはISO 3166-1を使用します。数値IDとは異なり、3文字の国コードは、ラテンアルファベットを読むことができる世界中のほとんどすべての人に、どの国が言及されているかを示します。
Quassnoi 2009年

これは、同じテーブルで自然言語の翻訳に対応するために実装した別の方法です。当然のことながら、結果として多くのフィールドは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つ作成しました。コード自体がキーだったので、別のキーを持つことに意味はありませんでした。また、一部のコンテキストでは言語コードの説明が言語によって異なるため、修正された説明はありませんでした。

一般に、追加の属性を持たない信頼できる値のリストが必要な場合は、1列のテーブルに適しています。


5

私は常に単一列のテーブルを使用しています-もちろん、アプリのデザインが既にデータベースを使用しているかどうかにもよりますが。データベース接続を確立するオーバーヘッドの設計に耐えたら、可能な場合はすべての変更可能なデータをテーブルに入れます。

単一列テーブルOTMHの2つの使用法を考えることができます。

1)データ項目が存在します。ドロップダウンリストでよく使用されます。単純な正当性テストにも使用されます。

例えば。2文字の米国の州の略称。発送先の郵便番号。スクラブルで合法的な言葉; 等

2)スパースバイナリ属性。つまり、大規模なテーブルでは、ごく少数のレコードにのみ当てはまるバイナリ属性。新しいブール列を追加する代わりに、属性がtrueであるレコードのキーを含む別のテーブルを作成する場合があります。

例えば。末期疾患のある従業員; 年間360日の銀行(ほとんどが365を使用)。等

-アル。



4

ほとんどの場合、これはあなたが説明した状態テーブルなどのルックアップタイプのテーブルで見られます。ただし、これを行う場合は、一意性を強制するために列を主キーとして設定してください。この値を一意として設定できない場合は、1つの列を使用しないでください。


ここで単一の列を使用することはおそらく問題ありませんが、他の列にも一意性制約を設定できることに注意してください。
ステルスラビ

2

私は一般的にそう言うでしょう。列が1つだけ必要な理由がわかりません。これにはいくつかの例外があり、効果的に使用されています。それはあなたが達成しようとしていることに依存します。

データベースのスキーマを考えると、これらは本当に良い設計ではありませんが、実際にはユーティリティテーブルとしてのみ使用する必要があります。

私は過去に効果的に使用された数値テーブルを見てきました。


1

データベースの目的は、情報を相互に関連付けることです。関連するデータがない場合、どうすればよいですか?

たぶん、これはある種のコンパイルテーブル(つまり、FirstName + LastName + Birthdate)ですが、なぜそうしたいのかはまだわかりません。

編集:私はある種の簡単なリストのためにこの種のテーブルを使用することを見ることができました。それを何のために使っているのですか?


9
いいえ、データベースの主な目的は情報を保存することです。
スペンサールポート09年

ただし、スプレッドシートには情報を保存できます。そして、それらが互いに関連付けられていないばらばらの数字と文字の集まりである場合、情報はどのように役立ちますか?
マシュージョーンズ、

データベースを使用するアプリケーションそれを必要とし、固定されたセットではないため、この情報は役立ちます。つまり、DBは、データベースアプリで使用される情報を置くための最も便利な場所です(リレーショナルまたはその他)。私たちは、リレーショナルの理想に関して私たちの純粋さを証明するためのアプリを作成するのではないことにご同意いただけると思います。代わりに、役立つアプリを作成します。
マークブリッティンガム

@Mark-それは私が簡単なリストで意味したものです。私は自分自身をうまく説明していなかったと思います。
マシュージョーンズ、

1
@SR-いいえ、データベースの主な目的は情報を取得することです。多くの場合、関心のある行は他のデータに依存しているため、MJの元のコメントは有効です。
CurtainDog 2009年

1

はい、あなたが言ったようにフィールドが主キーである限り。その理由は、重複したデータを挿入した場合、それらの行は読み取り専用になるためです。重複している行の1つを削除しようとした場合。サーバーは削除する行を認識しないため、機能しません。


2
それはばかげています。主キーまたは制約のない削除操作では、一致するすべての行が無視されずに削除されます。
Erik Funkenbusch 2009年

1
「動作しない」とは、「期待どおりに動作しない」という意味であり、「1つの行を削除したが両方ともなくなった」という状態をカバーしています。
GWLlosa 2009年

または、[テーブルを開く]ビューからSSMSのレコードを削除しようとすると、実際には、レコードを一意に識別できないというダイアログが表示され、何も行われません...
Michael Fredrickson

-1

私が思いつくことができる唯一のユースケースは、おそらく単語ゲームの単語表です。文字列が単語であることを確認するためだけにテーブルにアクセスします。単語=?の単語から単語を選択します。ただし、単語のリストを保持するためのデータ構造は、リレーショナルデータベースよりもはるかに優れています。

それ以外の場合、データベースのデータは通常、データベースに配置され、データのさまざまな属性間の関係を利用します。データにその値を超える属性がない場合、これらの関係はどのようにして開発されますか?

したがって、違法ではありませんが、一般的には、たった1列のテーブルを作成するべきではありません。


これに似ているのは、ループを停止するのに非常に便利な数値の表です。
u07ch 2009年

-1

私のすべてのテーブルには、少なくとも4つの技術フィールド、シリアル主キー、作成と変更のタイムスタンプ、およびブール値のソフト削除があります。どのブラックリストでも、誰がエントリを追加したかを知ることもできます。したがって、私にとっては答えは「いいえ」です。列を1つだけ持つテーブルは、何かをプロトタイプ化する場合を除いて意味がありません。


1
データテーブルとトランザクションテーブルを混同しているようです。私の意見では、これらは2つの別個のものでなければなりません。
Josh Noe 2014

-2

はい、それで問題ありません。しかし、IDフィールドはそれを正しく傷つけることができませんでしたか?


7
実際には可能です。有効な値の明確なリストがある場合、値が一意ではないことを意味するため、最後に必要なのはIDフィールドです。「水色が」キーであれば、あなたはIDが1の「水色」はID 4と「水色」から異なる場合がありますことを、誰かの思考をしたくない
ジェレミー・ボーク

IdはIDである必要があると誰が言いますか?またはキーの一部?
Eric

3
これは合成キーである可能性があり、元のフィールドには一意の制約がある可能性があります。
Mark Canlas、2009年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.