6

所以我对如何在一列中存储电话号码列表有点困惑。以下是要求:

  1. 用户可以拥有多个电话号码。
  2. 电话号码必须是唯一的,因此如果用户 A 添加了用户 B 使用的电话号码,则应显示验证错误。
  3. 如果用户有多个电话号码,则应选择默认电话号码。
  4. 解决方案必须与 Postgresql 兼容。

我想到了四种可能的解决方案:

  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. 一个字段中的电话号码数组:phone_number将存储逗号分隔的电话号码,例如“+1-800-123-1234,9237492734”。检查现有电话号码很容易User.where("phone_number LIKE '%+1-800-123-1234%'"),但数据库要花很多时间才能找到它。default_phone也将被添加到表格中,或者按照惯例将第一个电话号码设为默认号码。
  3. 将电话号码限制为 3 个(足够了)并创建phone_number_1,phone_number_2phone_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

两张桌子是要追求的解决方案。您可能有多个用户可以通过同一个电话号码联系到他们,例如作为固定电话的工作号码或家庭号码。

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 回答