具有多个地址的用户,但用户具有主要帐单,送货和个人资料地址

时间:2013-09-19 21:25:25

标签: mysql sql ruby-on-rails database-design has-many-through

我正在构建一个Rails应用,其中User可以包含多个AddressesUser还需要主要结算Address,主要付款Address和主要个人资料Address。这些主要字段可以指向相同的AddressUser不能包含任何主要Address

我创建了一个名为AddressInfo的联接表,我在几个选项之间蹦蹦跳跳:

  1. User模型上创建与每个主要Address ID对应的3列(这样就不需要我认为的连接模型了。)
  2. primary添加AddressInfo布尔列,并确保在user_idaddress_idpurpose范围内只有一个为真(目的为{ {1}},billingshipping)。
  3. profile日期时间列添加到primary,并使用最近更新的主要地址(作用于选项2)。
  4. 也许这些选项不是最好的,但这是我到目前为止所提出的。

    有关如何解决此问题的任何帮助将不胜感激。

    更新

    要明确的是,一旦创建AddressInfo,它应该始终属于Address并且不可删除。防爆。 User将其主要帐单邮寄地址更改为新的User:他们应该仍然可以检索旧Address(甚至可能再次将其设为主要地址)。如果我选择选项1并删除联接表,则表示我需要在Addressuser_id

3 个答案:

答案 0 :(得分:1)

使用选项1,3列。这样可以减少头痛(作为程序员),运行速度更快,并且可以更灵活地将类似地址合并为一个。也许你有2个人拥有相同的地址,他们可以分享相同的记录(虽然没有记录)。

答案 1 :(得分:0)

如果您使用的是轨道,我会寻求一种轨道解决方案来“保持轨道”。

我会考虑STI(Single Table Inheritance
有关详情,请访问Rails: Need help defining association for address table

或多态关系 - http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

如果您希望1个用户拥有多个地址(而不是多个用户类型),那么STI可能最适合您。

注意:它们也可以合并,例如http://www.archonsystems.com/devblog/2011/12/20/rails-single-table-inheritance-with-polymorphic-association/

STI有一个很好的例子可以解决这个问题:http://blog.arkency.com/2013/07/sti/

答案 2 :(得分:0)

另一种可能性是创建另一个模型来保存user.id,addressinfo.id和primary_for_address_type(包含" Shipping"," Profile"," Billing&#34 ;)

将此限制在user和primary_for_address_type上是唯一的,并且您可以以完全可扩展的方式将AddressInfo中的地址标记为特定地址类型的主要地址,这仍然保证了主地址的唯一性。

您可以直接从此模型加入以解决问题,但可以使其与您的地址信息模型不同步。