2

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

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

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

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

4

2 回答 2

2

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

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

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

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

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

于 2012-04-03T21:39:52.017 回答
1

我个人会选择以下内容:

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.

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

于 2012-04-03T21:40:09.397 回答