0

我正在使用 Yii 框架为我的实习设计一个数据库和匹配网站,主要使用 PHP。我们的目标是让管理用户完全灵活地选择他们想要显示的信息,因此我们试图保持应用程序动态。因此,这个想法是针对数据库中的选项/数据,而不是代码内部。我目前有一个工作设置,但我不确定这是否是正确的方法。长篇大论,对不起。目前我们有:

关系
+ 用户HAS MANYuser_phone
+ user_phoneHAS MANY用户
+ user_phone HASuser_phone_type


用户 <-- user_phone_assignment --> user_phone --> user_phone_type

用户电话类型
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
limit INT NOT NULL

基本的用户资料信息存储在 user 中,为了减少家庭和兄弟姐妹实例中的重复数据,user_phone 有一个潜在多对多的分配表。user_phone_type 的想法是我们存储一个名称,例如“Home”、“Work”、“Fax”、“Other”等。

user_phone_type.limit < 0
+ 字段已禁用,不显示 actionCreatePhone
user_phone_type.limit = 0
+ 字段已启用,允许无限条目,始终显示
user_phone_type.limit > 0
+ 字段已启用,在 count(user_phone) < user_phone_type.limit 时显示

我觉得这个系统可能是可行的,但我不确定这是否是最好的解决方法。有没有人有任何其他选择来保持应用程序的灵活性和面向数据库的同时保持更简单的关系?也许是某种配置表设置,我们可以将配置值存储在模型或控制器内的局部变量中。

4

1 回答 1

1

小心你的规范化。一些看起来像是潜在的多对多关系的东西实际上只是属性。电话号码和地址虽然您可以对它们进行多对多建模,但在这种情况下可能难以管理,因为您必须处理不断变化的电话号码和地址。在一对多模型中,当地址或电话号码更改时,用户的地址或电话号码与用户一样多,您只需在表中更新它。在多对多模型中,当地址或电话号码发生变化时,您必须确定是地址发生了变化,还是用户对特定地址的分配发生了变化。我见过人们尝试实现这一点,但它总是会出错,因为你通常会分配一个邮寄地址和一个客户地址,或者一个家庭电话和一个手机,

让我们用电话号码尝试一个简单的场景:

假设用户#1 的工作电话号码是 513-555-1234,他的手机号码是 513-555-4321。假设用户#2 具有相同的工作电话号码 513-555-1234 和手机号码 513-555-4322。

现在假设用户#1 放弃了他们的工作电话号码,或者将其更改为其他号码。在删除号码的情况下,我们需要做的是删除用户和电话号码之间的链接,因为如果我们只是删除电话号码字段,用户#2 也会丢失他们的工作电话。现在我们必须决定如果我们刚刚取消链接的用户是最后一个指向电话号码的用户,该怎么办。我们是删除电话号码还是保留它以防其他人拿起它?更改电话号码更加复杂。由于无法知道更改是否是对无效电话号码的更正,并且应该为与之相关的每个人都更改,因此我们必须决定更改电话号码是否会为所有人更改(最终是个坏主意因为如果用户更换工作并且他们的工作编号发生变化,用户原工作地点的其他人也是如此,这显然是错误的),或者如果电话号码的更改仅影响分配给它的单个用户。可能是基于标准用户维护 UI 的最佳选择,因为它模仿了一对多方法的行为。但是,您不仅要更改电话号码,还必须删除电话号码的链接,然后创建新的电话号码记录,然后将客户链接到该记录。在这两种情况下,您不仅要插入新记录,还必须检查以确保新电话号码不存在。如果确实存在,那么您只需将用户链接到新号码,而不是创建新号码并链接到该号码。真的,所有这些复杂性为您节省了什么?不多。如果你做这样的事情,也许需要一点时间来验证地址。也许你的电话号码中有 1% 的电话号码与工作电话号码重叠,但现在大部分工作电话都是直拨电话,所以这甚至可能不是真正的节省。我什至看到地址被分成不同的文件并且根本没有管理,只是添加了一个新地址,无论它是否重复,仅将地址放在父表中没有节省。

所以我的意见,这就是所有这些问题会产生的,是你不应该试图担心将电话号码或地址放在他们自己的单独表格中,除非很有可能许多可能的地址或电话号码将是丢失,并且在这些情况下您不会写空白地址记录。即使您确实将它们保存在单独的表中,也不要担心删除重复项(通过使用多对多关系),因为这只会给您的应用程序增加不必要的复杂性。

于 2013-07-22T20:44:41.103 回答