我知道这个模式有很多问题,但我找不到完美的解决方案。我仔细查看了这些SO页面:32996898,24039964,648463,15503913,2494452
在我的应用中,有几个型号有一个或多个(取决于)地址。我试着想一下如何正确设计它。我找到了两种解决方案,但在我看来并不理想。
选项#1 :a.k.a 规范化:
addresses (id, alias, line_1, line_2, city_id, country_id) address_types (id, name) {name: billing, shipping, ...} customer_addresses (id, address_id, address_type_id, default, status) supplier_addresses (id, address_id, address_type_id, default, status) pickup_point_addresses (id, address_id, address_type_id, default, status)
我喜欢地址和address_types表,但最后三个非常相似。
选项#2 :a.k.a polymorphismed 一个:
addresses (id, address_type_id, addressable_type, addressable_id, alias, line_1, line_2, city_id, country_id, default, status) address_types v (id, name) {name: billing, shipping, ...}
很好,但我不喜欢我在地址中没有简单地址的事实。我想保留地址'选项#1的模式。此外,许多用户可以共享相同的地址(特别是对于拾取点)
选项#3 :a.k.a' 之间我会建议你'一个(也是多态的):
addresses (id, line_1, line_2, city_id, country_id) entity_addresses (id, addressable_id, addressable_type, address_id, default, status, alias)
class Address < ActiveRecord::Base
belongs_to :city
belongs_to :country
has_one :entity_address
...
end
class EntityAddress < ActiveRecord::Base
belongs_to :addressable, :polymorphic => true
belongs_to :address
...
end
class Customer < ActiveRecord::Base
has_many :addresses, as: :addressable
...
end
class Supplier < ActiveRecord::Base
has_many :addresses, as: :addressable
...
end
class PickupPoint < ActiveRecord::Base
has_many :addresses, as: :addressable
...
end
class Order < ActiveRecord::Base
belongs_to :customer
belongs_to :shipping_address, class_name: 'Address'
belongs_to :billing_address, class_name: 'Address'
...
end
Con:s:
- entity_address是一个桌子的可怕名字。 (请帮我找一个新名字,我发现Addressable也不好用于名字表)
Pro(s):
- 地址表名称恰当,仅用于一个目的。此模型中没有重复项。每个地址都是独一无二的。
- 地址将是不可变的(仅为数据的完整性而创建 - 例如,订单中的送货地址)
- entity_address允许管理地址(更改别名,使地址成为默认地址,删除等等)
- 没有更多的address_type表。在订单表中,我将添加两个外键(shipping_address,billing_address)
您对选项#3有何看法?我也不确定最后一点(订单表中的两个外键)。