0

ユーザー名、パスワードフィールドを持つユーザー Ruby on Rails モデルがあります。その画像のような編集プロファイルフォームを追加したい

画像リンク

ユーザーがフィールドに基づいて自分のプロファイル情報を共有したいかどうかに関係なく、どのフィールドにも追加の共有ボックス (ブール値) が必要です。

この種のモデルを編成する最良の方法は何ですか? 理想的には、これは各フィールド情報を個別に格納するためのキー値のようなテーブルにする必要があります。何かのようなもの

キー、バリュー、シェア?

Firstname, John, true
Lastname, Smith, true
Gender, male, false
Brithday, 19.01.1985, true

この種のモデル構造を整理する最良の方法は何ですか?

4

2 に答える 2

0

EAV 構造に関するいくつかの問題:

  • SQL データ型を使用できなくなります (すべての値が TEXT である必要があります)。

  • UNIQUE や FOREIGN KEY、さらには NOT NULL などの SQL 制約を使用できなくなります。

  • 属性の数だけ自己結合を行う巨大なクエリを作成しないと、データの行を 1 つの行としてクエリする機能が失われます。

  • 使用するたびに「キー」または属性名を保存するのは非常に無駄です。

それで十分?

これがデータを保存するための「普遍的な」方法だと誰かが考えたために、ほとんど閉鎖された会社についてのこの記事を読んでください: Bad CarMa .

については、StackOverflow、ブログ記事EAV FAIL、および著書SQL Antipatterns: Avoiding the Pitfalls of Database Programming で何度も議論してきました。

リレーショナルデータベースのより良い解決策は、属性ごとに 1 つの列を定義することです。

  • 列に意味のある名前を付けることができます。これは、すべての行ではなく、メタデータとして 1 回保存されます。

  • 適切な SQL データ型を使用して、適切なデータ検証を実施できます。

  • SQL 制約を使用して、データの整合性を高めることもできます。そうしないと、アプリに大量のコードを記述してデータ ルールを実装する必要があります。

于 2013-10-10T22:24:14.393 に答える
0

あなたの問題は次のようになります:「EAV を使用する必要がありますか?」

このテーマに関する適切なフォーラム ディスカッションについては、こちらを 参照してください。

ほとんどの場合、答えはノーだと思います (「SQL アンチパターン EAV」をグーグルで検索して、この件に関する多くのリソースにアクセスしてください)。すべてのフィールドを含む単純なテーブルを使用しないのはなぜですか? 属性ってそんなにあるの?フィールドが定数でない場合 (EAV を避けるため)、Blob 列内にデータを格納することもできます。

于 2013-10-02T07:11:48.413 に答える