6

そのため、電話番号のリストを 1 つの列に格納する方法について少し混乱しています。要件は次のとおりです。

  1. ユーザーは複数の電話番号を持つことができます。
  2. 電話番号は一意である必要があるため、ユーザー A がユーザー B が使用する電話番号を追加した場合、検証エラーが表示されます。
  3. ユーザーが複数の電話番号を持っている場合は、デフォルトの電話番号を選択する必要があります。
  4. ソリューションは Postgresql と互換性がある必要があります。

私は4つの可能な解決策を考えました:

  1. HStore:phone_numberすべての電話番号のハッシュを格納するフィールドを作成します。例えば{1=>"+1-800-123-1234", 2=>"9237492734", "default"=>1}。この場合、新しい電話番号が一意であることを確認するために、多くのクエリを実行する必要があります。たとえば、クエリを実行してからUser.where("phone_number @> ('1' => '+1-800-123-1234')")2 をチェックインする必要がありますUser.where("phone_number @> ('2' => '+1-800-123-1234')")...など。
  2. 1 つのフィールドに電話番号の配列: phone_number「+1-800-123-1234,9237492734」のようなカンマ区切りの電話番号を格納します。既存の電話番号を確認するのは簡単User.where("phone_number LIKE '%+1-800-123-1234%'")ですが、データベースがそれを取得するには時間がかかります。default_phoneもテーブルに追加されるか、慣例により最初の電話番号がデフォルトの電話番号になります。
  3. 電話番号を 3 つに制限し (これで十分です)、phone_number_1phone_number_2およびphone_number_3フィールドを作成します。電話番号の一意性をチェックすると、3 つのクエリが消費されます。も追加する必要がありますdefault_phone
  4. 新しいテーブルphone_numbers(id:integer、user_id:integer、phone_number:string、default:boolean) を追加し、User モデルと has_many 関係を設定します。これは本当に魅力的ではありません... 1つのフィールドに対してテーブル全体を作成します。ただし、検索が高速で、各ユーザーに無制限の電話番号があります.

アイデア、ヒント、提案は大歓迎です。

4

1 に答える 1

9

2つのテーブルが後を追う解決策です。固定電話である職場番号や自宅番号など、同じ電話番号で到達できる複数のユーザーがいる可能性があります。

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  -- other bits of information
);

CREATE TABLE phone_numbers (
  user_id INTEGER REFERENCES users (id),
  phone_number TEXT NOT NULL,
  location TEXT NOT NULL, -- Mobile, home, work
  PRIMARY KEY (user_id, phone_number),
  INDEX (phone_number)
);

「各人が一意の電話番号を持っていて、その電話番号を使用して他の人に連絡することはできない」を本当に強制したい場合は、phone_number列にUNIQUE制約を追加するだけです。

于 2012-11-11T12:18:33.530 に答える