Ruby on rails 地址和实体(客户、供应商、取货点)的优化设计
我知道这个模式有很多问题,但我没有找到完美的解决方案。我仔细看了一下那些页: 在我的应用程序中,几个型号有一个或多个(视情况而定)地址。我试图找出如何正确地设计它。我找到了两种解决方案,但在我看来并不理想 选项1:a.k.a规范化选项: 地址(id、别名、第1行、第2行、城市id、国家id) 地址类型(id,名称){名称:账单,发货,} 客户地址(id、地址id、地址类型id、默认值、状态) 供应商地址(id、地址id、地址类型id、默认值、状态) 拾取点地址(id、地址id、地址类型id、默认值、状态) 我喜欢地址和地址类型表,但最后三个非常相似 选项2:a.k.a多态性选项: 地址(id、地址类型id、可寻址类型、可寻址id、别名、第1行、第2行、城市id、国家id、默认值、状态) 地址(id,name){名称:账单,发货,} 很好,但我不喜欢地址中没有简单地址的事实。我想保留选项1的地址模式。此外,许多用户可以共享同一地址(特别是对于取货点) 选项3:a.k.a“我想向你求婚的事情”一个(也是多态的): 地址(id、第1行、第2行、城市id、国家id) 实体地址(id、可寻址id、可寻址类型、地址id、默认值、状态、别名)Ruby on rails 地址和实体(客户、供应商、取货点)的优化设计,ruby-on-rails,design-patterns,activerecord,data-modeling,Ruby On Rails,Design Patterns,Activerecord,Data Modeling,我知道这个模式有很多问题,但我没有找到完美的解决方案。我仔细看了一下那些页: 在我的应用程序中,几个型号有一个或多个(视情况而定)地址。我试图找出如何正确地设计它。我找到了两种解决方案,但在我看来并不理想 选项1:a.k.a规范化选项: 地址(id、别名、第1行、第2行、城市id、国家id) 地址类型(id,名称){名称:账单,发货,} 客户地址(id、地址id、地址类型id、默认值、状态) 供应商地址(id、地址id、地址类型id、默认值、状态) 拾取点地址(id、地址id、地址类型id、默认
类地址true
属于:地址
...
结束
类Customer
Con(s):-实体_address对于表来说是一个非常可怕的名称。(请帮我找到一个新名称,我发现可寻址也不适合名称表) 专业版:
-地址表的名称恰当,并且只用于一个目的。此模型中没有重复项。每个地址都是唯一的。 -地址将是不可变的(仅为数据的完整性而创建-例如订单中的发货地址)
-实体地址允许管理地址(更改别名、将地址设为默认地址、删除地址等…)
-没有更多地址类型表。在订单表中,我将添加两个外键(发货地址、账单地址) 你对选项3有什么想法?我也不确定最后一点(orders表中的两个外键) 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) 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, ...} 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