ドロップダウン リストから選択した値、またはユーザーが入力した値を保存する場合の DB 設計のベスト プラクティスは何ですか?
-
03-07-2019 - |
質問
次のシナリオを可能にするためにデータベースを設計する最適な方法を見つけようとしています。
- ユーザーには大学のドロップダウン リストが表示されます (例)
- ユーザーは自分の大学が存在する場合はリストからそれを選択します
- 大学が存在しない場合は、テキスト ボックスに自分の大学を入力する必要があります (「その他」のようなもの)。[____________])
たとえば、大学 ID を使用して並べ替えたい場合 (おそらく、ユーザーが入力した大学ではなく、組み込みの大学のみを対象とします) を考えると、このような状況に対処するデータベースをどのように設計すればよいでしょうか。
ありがとう!
Facebook がこの状況に対処する方法と同じようにしたいだけです。ユーザーが自分の学歴を選択し(コンボボックスに実際に入力することですが、これは私には関係ありませんが)、返された値の 1 つを選択した場合、Facebook はどうするでしょうか?
私の推測では、UserID と EducationID を多対多のテーブルに挿入することになると思います。では、入力しようとしているユーザーがデータベースにまったく存在しない場合はどうなるでしょうか?それはまだ彼のプロフィールに保存されていますが、どこにありますか?
解決
CREATE TABLE university
(
id smallint NOT NULL,
name text,
public smallint,
CONSTRAINT university_pk PRIMARY KEY (id)
);
CREATE TABLE person
(
id smallint NOT NULL,
university smallint,
-- more columns here...
CONSTRAINT person_pk PRIMARY KEY (id),
CONSTRAINT person_university_fk FOREIGN KEY (university)
REFERENCES university (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);
public は、システム内の Uni の場合は 1 に設定され、ユーザーが入力した Uni の場合は 0 に設定されます。
他のヒント
あなた できた 浮気:このフィールドの参照整合性を気にしない場合 (つまり、これはユーザーのプロファイルに表示するためだけに存在し、厳密に適用されるビジネス ルールには必要ありません)、単純な VARCHAR 列として格納します。
ドロップダウンには、次のようなクエリを使用します。
SELECT DISTINCT(University) FROM Profiles
タイプミスや一回限りのものを除外したい場合は、次のことを試してください。
SELECT University FROM PROFILES GROUP BY University HAVING COUNT(University) > 10 -- where 10 is an arbitrary threshold you can tweak
このコードは、請負業者の取引説明を保存するためにデータベースの 1 つで使用されます。これは情報提供のみであるため (ビジネス ルールを適用するための別の「カテゴリ」フィールドがあります)、許容可能な解決策です。
他のデータ ポイントと同じテーブルに、ユーザー入力によって入力された行のフラグを保持します。その後、フラグを使用して並べ替えることができます。
私が以前働いていた会社でこれを解決した方法の 1 つは、次のとおりです。
テーブルに 2 つの列を作成します。1)システムがサプリングした文字列の無駄なID(別のテーブルに保存)2)ユーザーが提供した文字列
これらのうち 1 つだけが設定されます。制約により、これを強制できます (さらに、必要に応じて、これらの列の少なくとも 1 つが設定されるようになります)。
これで解決しようとしていた問題は、真の「その他:」状況であることに注意してください。それは、いくつかのプリセットデフォルトを備えたアイテムのテキストによる説明でした。あなたの状況はリストに載っていない実際の存在のように思えます、s.t.複数のユーザーが同じ大学を入力したい場合があります。
これはデータベース設計の問題ではありません。それは UI の問題です。
大学のドロップダウン リストは、テーブルの行に基づいています。ユーザーがテキスト ボックスに新しい大学を入力すると、そのテーブルに新しい行が挿入される必要があります。
提供したリストとユーザーが追加したリストを分離したい場合は、University テーブルにデータの出所 (または出所) を示す列を含めることができます。
ここでの質問が非常に明確かどうかはわかりません。
私はこれを仕事で何度も行ってきましたが、テキストボックスのドロップダウンリストから選択するだけです。データがテキスト ボックスに入力されている場合は、まずデータベースに挿入し、次に IDENTITY を使用して、その後のクエリのために挿入された行の一意の識別子を取得します。
INSERT INTO MyTable Name VALUES ('myval'); SELECT @@SCOPE_IDENTITY()
ただし、これは MS SQL 2008 に違反します。 @@SCOPE_IDENTITY() グローバルが SQL の他のバージョンに存在するかどうかはわかりませんが、同等のものが存在することは確かです。