使用一对一表关系有什么好处?(MySQL的)

Lot*_*tes 16 php mysql database oop

与简单地将所有数据存储在一个表中相比,使用一对一表关系有什么好处?我一直理解并使用一对多,多对一和多对多,但实现一对一的关系似乎是一项单调乏味且不必要的任务,特别是如果你使用命名将(php)对象与数据库表相关联的约定.

我在网上或网站上找不到任何可以提供一对一关系的真实世界范例的例子.起初我认为将"用户"分成两个表可能是合乎逻辑的,一个表包含公开信息,如关于我的个人资料页面和一个包含私人信息(如登录/密码等)等.但为什么要去通过使用不必要的JOINS的麻烦,你可以选择从该表中选择哪些字段?如果我正在显示用户的个人资料页面,显然我只会选择id,用户名,电子邮件,aboutme等,而不是包含其私人信息的字段.

有人想用一对一关系的一些真实世界的例子来启发我吗?

rek*_*o_t 9

一种可能的用途是部分信息是可选的.这样,您不需要在一个大表中包含一堆可空字段,但可以将其逻辑地分隔为强制表和可选表.

其他用途是当一些数据与不同的表共享时.例如,假设您有一个销售计算机零件的网站.您可以将所有组件共享的详细信息放入例如."parts"表,但将细节放在"主板","cpus"等中,这些只会使用具有一对一关系的零件表.


Pau*_*xon 6

这是两个,我相信其他人会发布更多

  • 您希望扩展现有表而不实际修改表.也许它是由第三方供应商提供的,并且您希望通过简单地使用共享相同密钥的第二个表来保持扩展分离.
  • 也许在表格中有固定宽度的列可以经常访问,而可变的则不是.在这种情况下,对于频繁的东西,具有固定行长度的表可能会有效率增益,其他所有东西都有辅助表.

此外,在规范化数据库时,例如对第3范式(3NF),您可能会发现您的列不是真正"关键"的键,需要将其拉出到单独的表中.


Nic*_*ini 6

我使用了一对一的关系来扩展现有应用程序中的某些功能,而不会影响应用程序数据库结构.这是扩展现有数据库表的一种不引人注目的方式.

使用一对一关系的另一个原因是实现类表继承,其中层次结构中的每个类都有一个表,并且一个对象在其表类中,在其父类表中,在其祖父级类中具有相应的行表等.

例如,参见Doctrine 2 Class Table Inheritance Page

  • 是的,我的意思是延伸到byronh给出的意义上.但是,我没有说这是"一个好主意",我只是说这可能是一个原因.如果一件事情好或不好,也取决于背景.有时我不想要,我不能改变第三方数据库,所以我用一对一的关系"扩展"那些表 (5认同)

Wha*_*kee 5

特别针对您的示例:您不希望用户信息(如名称和地址)与登录名和密码信息存储在同一个表中,因为这样您可以授予组织中某人对用户信息表的权限,而不是登录数据表.我不同意其他人对"一桌一桌太多"主题的看法.如果有很多字段,并且您不需要在表单或报表中使用它们,则可以只选择sql所需的字段,甚至可以使用视图来确保不会获得太多数据.


sym*_*ean 5

最常见的原因是这种关系可能是非强制性的。即有一组适用于每个基本实体的属性,但有些属性仅适用于一个子集。

这样做的另一个有效原因是控制访问权限 - 您可能有一个在整个应用程序中使用的客户表,尽管每个客户都有密码和信用卡,但您可能希望限制可见性/更新权限。

Marga Keuvelaar 对 Ignacio Vazquez-Abrams 回答的评论是错误的。您可以使用更好的 DML/DDL 来减轻影响,但并非在所有情况下。但是,您正在权衡数据模型的透明度与性能优势 - 这始终需要仔细考虑。

C。