Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 地址和实体(客户、供应商、取货点)的优化设计_Ruby On Rails_Design Patterns_Activerecord_Data Modeling - Fatal编程技术网

Ruby on rails 地址和实体(客户、供应商、取货点)的优化设计

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、默认

我知道这个模式有很多问题,但我没有找到完美的解决方案。我仔细看了一下那些页:

在我的应用程序中,几个型号有一个或多个(视情况而定)地址。我试图找出如何正确地设计它。我找到了两种解决方案,但在我看来并不理想

选项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、默认值、状态、别名)
类地址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