【问题标题】:Database Design: Default Address数据库设计:默认地址
【发布时间】:2012-04-17 14:23:03
【问题描述】:

我的数据库有一个组织表和一个地址表。在地址表中,我想存储用户 ID 和组织 ID,以便我以后可以查找它们,并且还有多个组织地址,或者让用户能够选择他们为不同组织添加的地址。这里的一个例子是如果 2 个组织共享相同的财产。我还希望我的组织表存储默认地址 ID。然而,当在 FuelPHP 中使用 ORM 模型时,这被证明很尴尬(可能无关紧要,这只是让我注意到可能的设计缺陷)。

以上是一种选择,我可以想到另外两种解决方案。一种是有一个默认的地址表存储组织ID和地址ID,地址表仍然可以存储用户和组织ID。然后,我可以从组织表中选择内连接默认地址表,并从地址表中内连接地址 ID 以检索地址。

第二个选项是在我的地址表中有一个默认地址字段,如 bool 类型。然后,我在需要时在选择中使用 where 语句来检索此地址。

第二个选项是我目前的首选选项,因为这意味着我不必做太多工作来更改我的表、在我的 PHP 框架 ORM 模型中添加键和设置关系。但是,如果数据库变得更大并且性能成为问题,这些方法中哪种方法最好?还有其他我没有考虑过的方法吗?

【问题讨论】:

    标签: database database-design default-value addressbook


    【解决方案1】:

    听起来您在组织和地址之间存在 m:m(多对多)关系。所以在数据库中表示这种关系的最好方法是引入一个新的表来表示这种关系。

    我不确定您的意思是默认地址是给定公司的默认地址,还是创建公司时给定用户的默认地址。在第一种情况下,您可以将其添加为新创建的表示关系的表的属性。在后一种情况下,您可以在用户表中放置一个外键,表示默认地址。

    关于性能,使用整数键并制作适当的索引...!也就是说,跳过关系表并为同一地址上的不同公司创建相似地址当然会更快。这将为您节省一个加入公司+地址查找的机会。但是,如果您需要查找给定地址上的所有公司,这将慢得多,因为您必须读出不同的地址并进行比较。

    所以这完全取决于您想如何使用您的数据。我会选择“正确”选项(一个新的关系表),因为使用正确的索引并不会慢很多,并且以后会为您提供更多可能性。

    下一个问题是如何让新用户选择一个现有的地址,而不是创建一个重复的条目。这将是您的界面设计中的一个挑战,您收集的数据的质量将在很大程度上取决于它。

    【讨论】:

    • 谢谢,这两个很好的答案都很难选择一个 - 这就是我最后所做的,但只是在顽固地将 is_default 字段添加到地址表并从组织表中删除 address_id 之后。然后就没有办法唯一地引用该组织的地址。应该为自己省去一些麻烦,但这是了解你为什么做事或何时以某种方式做事的好方法!它还帮助我了解了多/多关系实际上是什么。谢谢。
    • 没问题,很高兴我能帮上忙 :-)
    【解决方案2】:

    我个人会选择以下内容:

    Organization
    -------------
    OrgID
    OtherOrgColummns
    
    Address
    -------------
    AddressID
    OtherAddressColumns
    
    OrgAddresses
    -------------
    OrgID
    AddressID
    IsDefault
    

    虽然根据您的描述我不能确定这是否可行。

    警告 - 大约有 10,000 种方法可以写出相同的地址。例如:

    111 First Street
    111 1st street
    111 1st st.
    111 1st str
    etc.
    

    我不知道您对让人们输入重复项有多担心,但如果这是一个问题,我建议您使用地理编码服务来获取地址的纬度,然后使用经度来确定您是否已经在你的数据库中有一个地址...只是一个想法...

    【讨论】:

    • 在这个设计中你必须确保你没有为同一个OrgId设置多个OrgAddresses默认
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    相关资源
    最近更新 更多