地址和实体(客户,供应商,提货点)的最佳设计

时间:2017-02-09 20:47:44

标签: ruby-on-rails design-patterns activerecord data-modeling

我知道这个模式有很多问题,但我找不到完美的解决方案。我仔细查看了这些SO页面:3299689824039964648463155039132494452

在我的应用中,有几个型号有一个或多个(取决于)地址。我试着想一下如何正确设计它。我找到了两种解决方案,但在我看来并不理想。

选项#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有何看法?我也不确定最后一点(订单表中的两个外键)。

0 个答案:

没有答案