Rails/postgres:为一个用户存储电话号码列表的最佳方式是什么
问题:Rails/postgres:为一个用户存储电话号码列表的最佳方式是什么
所以我对如何在一列中存储电话号码列表有点困惑。以下是要求:
-
用户可以拥有多个电话号码。
-
电话号码必须是唯一的,因此如果用户 A 添加了用户 B 使用的电话号码,则应显示验证错误。
-
如果用户有多个电话号码,则应选择默认电话号码。
-
解决方案必须与 Postgresql 兼容。
我想到了四种可能的解决方案:
- HStore:制作一个
phone_number字段,存储所有电话号码的哈希值。例如{1=>"+1-800-123-1234", 2=>"9237492734", "default"=>1}.在这种情况下,我需要进行大量查询以确保新电话号码是唯一的,例如我需要查询User.where("phone_number @> ('1' => '+1-800-123-1234')")然后签入 2User.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 个(足够了)并创建
phone_number_1、phone_number_2和phone_number_3字段。检查电话号码的唯一性将消耗 3 个查询。还需要添加default_phone。 -
添加新表
phone_numbers(id:integer, user_id:integer, phone_number:string, default:boolean) 并设置has_many与User模型的关系。这并不是真正的诱惑......为 1 个字段创建一个完整的表。但它具有快速查找功能,并且每个用户都有无限的电话号码。
非常感谢任何想法、提示和建议。
解答
两张桌子是要追求的解决方案。您可能有多个用户可以通过同一个电话号码联系到他们,例如作为固定电话的工作号码或家庭号码。
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 约束。
更多推荐
所有评论(0)