1. ホーム
  2. sql

[解決済み] SQL Server データベースで単一行構成テーブルを使用する。悪い考えですか?

2022-04-26 02:17:45

質問

ショッピングカートアプリケーションの開発において、管理者の好みや要件に基づいた設定や構成を保存する必要があることに気づきました。この情報は、会社情報、配送アカウントID、PayPal APIキー、通知設定など、何でもありです。

リレーショナルデータベースシステムで1行を保存するためにテーブルを作成するのは、非常に不適切だと思われます。

この情報を保存するには、どのような方法が適切でしょうか?

注:私のDBMSはSQL Server 2008で、プログラミング層はASP.NET(C#で)で実装されています。

どのように解決するのですか?

私は過去に、1行のテーブルとキーと値のペアのテーブルという2つの方法でこの方法を行ったことがありますが、それぞれの方法にはプラスとマイナスがあります。

単一行

  • 正:値が正しい型に格納されていること
  • 正:コードで扱いやすくなる(上記のため)
  • 正:各設定に個別にデフォルト値を与えることができる
  • 否定的: 新しい設定を追加するには、スキーマの変更が必要です。
  • 否定的: 多くの設定がある場合、テーブルが非常に広くなることがあります。

キー/バリューペア

  • 正:新しい設定を追加してもスキーマの変更は必要ない
  • positive: テーブルスキーマが狭く、余分な行は新しい設定に使用されます。
  • 否定的: 各設定は同じデフォルト値を持つ(null/empty?)
  • 否定的: すべてを文字列として保存する必要がある (つまり nvarchar)
  • 否定的: コードで設定を扱う場合、設定がどのようなタイプであるかを知り、それをキャストする必要があります。

単行本のオプションは、圧倒的に作業しやすいものです。なぜなら、各設定をデータベースに正しい型として格納することができ、設定の型とそのルックアップキーをコードに格納する必要がないからです。

この方法で心配だったのは、1行の設定テーブルに複数の行が存在することです。私は、(SQL Serverで)これを克服しました。

  • 新しいbit列を追加し、デフォルト値を0にする。
  • この列の値が0であることを保証するチェック制約を作成します。
  • bit列に対する一意制約の作成

これは、bit列の値が0でなければならないが、一意制約のため、その値を持つ行はテーブル内に1つしか存在できないことを意味します。