首页 > 其他分享 >一对多的时候,用逗号分隔,存id,还是建表存id

一对多的时候,用逗号分隔,存id,还是建表存id

时间:2024-05-23 13:51:52浏览次数:8  
标签:数据完整性 存储 建表存 数据库 ID 逗号 查询 id

在数据库设计中,处理一对多关系时,是否使用逗号分隔的ID列表(也称为“序列化”或“规范化不足”的方法)或创建一个新的关联表来存储这些ID,是一个常见的决策点。

以下是两种方法的比较和考虑因素:

1. 使用逗号分隔的ID列表

优点:

  • 简单易实现,特别是对于不熟悉数据库设计的开发者来说。
  • 在某些简单的应用中,查询和更新可能更快(但这通常不是一个主要因素,因为性能瓶颈往往在其他地方)。

缺点:

  • 违反了数据库的第一范式(即每个字段只包含一个值),这可能导致数据完整性问题。
  • 难以进行有效的查询和更新操作,例如查找具有特定ID的所有记录或添加/删除一个ID。
  • 不支持使用数据库提供的ACID事务属性(原子性、一致性、隔离性、持久性)来确保数据完整性。
  • 不支持外键约束,这可能导致引用完整性问题。
  • 通常需要编写复杂的SQL查询或应用程序代码来处理这些逗号分隔的值。

2. 创建新的关联表

优点:

  • 遵循数据库设计的最佳实践,保持数据的完整性和一致性。
  • 易于查询和更新操作,因为你可以使用标准的SQL语句来执行这些操作。
  • 支持外键约束,确保引用完整性。
  • 可以利用数据库提供的ACID事务属性来确保数据完整性。
  • 更好地支持关系型数据库的其他功能,如索引、视图、触发器等。

缺点:

  • 需要额外的表来存储关联数据,可能会增加数据库的复杂性。
  • 在某些情况下,可能需要编写更复杂的查询来处理关联数据(但这通常比处理逗号分隔的值更简单)。

结论

在大多数情况下,建议创建新的关联表来存储一对多关系中的ID。这种方法更符合数据库设计的最佳实践,并提供了更好的数据完整性、一致性和可维护性。尽管它可能需要一些额外的设置和复杂性,但这些成本通常会被更好的性能和可维护性所抵消。

如果你正在处理的是一个非常简单的应用,并且确定不需要复杂的查询或更新操作,那么使用逗号分隔的ID列表可能是可行的。但是,请注意这种方法可能带来的潜在问题和限制。

==========================================

在 MySQL 中,如果一个字段需要存储多个值,一般有以下几种常见的做法:

  1. 用逗号分隔的字符串:将多个值用逗号隔开,存储为一个字符串,例如:"value1,value2,value3"。这种方法简单易行,但是不利于查询和修改。
  2. 使用 JSON:将多个值封装成一个 JSON 字符串,然后存储到字段中。这种方法灵活性较好,可以在 JSON 中添加一些键值对,以表示不同的值,但是不利于查询。
  3. 使用关联表:将多个值分别存储在另外的表中,然后使用外键关联到主表中。这种方法灵活性最好,但是需要更多的表和关联操作。
  4. 使用枚举类型:将字段的值限定在一定的枚举值中,然后存储枚举类型的值。这种方法限制了字段的值,不利于扩展,但是可以提高数据的规范性和查询性能。

因此,具体选择哪种方法,需要根据实际情况进行综合考虑。

========================================== 综上所述: 在大多数情况下,建议创建新的关联表来存储一对多关系中的ID。这种方法更符合数据库设计的最佳实践,并提供了更好的数据完整性、一致性和可维护性。尽管它可能需要一些额外的设置和复杂性,但这些成本通常会被更好的性能和可维护性所抵消。 这种决策方式同样适用于单个字段中存储json等。 ========================================== 更具体的优劣待补充。

 

标签:数据完整性,存储,建表存,数据库,ID,逗号,查询,id
From: https://www.cnblogs.com/super-chao/p/18208300

相关文章

  • IDocList/IDocDict JSON for Delphi and FPC
    IDocList/IDocDictJSONforDelphiandFPC【英文原文】多年来,我们的开源mORMot框架提供了多种方式,以处理在运行时定义的任何数组/对象文档组合,例如通过JSON,它具备许多功能,并且非常高的性能。我们的TDocVariant自定义变体类型是处理这类无模式数据的一种强大方式,但一些用户......
  • MySQL的自增ID连续性控制变量innodb_autoinc_lock_mode
    查看innodb_autoinc_lock_mode的值在MySQL命令行客户端中使用“SHOWVARIABLES”查看:MySQL[mydb]>SHOWVARIABLESLIKE'innodb_autoinc_lock_mode';+--------------------------+-------+|Variable_name|Value|+--------------------------+-------+|......
  • 别为难自己,这个IDEA插件节省了很大时间!!
    前言在后端SpringBoo开发中,都需要一个接口测试工具,从一开始的postman,到现在的国产测试工具,数不胜数,而最方便的莫过于在IDEA中就可以调试,因为IDEA插件中有能力分析出当前项目所编写的Controller数据,可以进行统计,更方便我们发起http请求,不需要复制url到别的测试工具了,今天就推荐一......
  • .net 直接在DataGridView控件中修改单元格数据,并保存到数据库
    1.获取datagridview单元格修改的内容//单元格的值发生改变时触发事件privatevoiddataGridView1_CellValueChanged(objectsender,DataGridViewCellEventArgse){//获取当前行绑定的内容AppraisalBasesitem=(AppraisalBases)dataGridView1.Rows[e.RowIndex].Da......
  • Python 逗号的巧用
    Python逗号的巧用如果需要在中的列表、字典或集合常量中添加或移除项,记住一个窍门:在所有行后面都添加一个逗号。还不太明白?来看一个示例。假设在代码中有下面这个由名字组成的列表:>>>names=['Alice','Bob','Dilbert']在修改这个名字列表时,通过gitdiff查看改动可能有点......
  • idea创建web项目
    创建web的jar包:file--module选择webapp添加参数:archetypeCatalog=internal;现实结果......
  • SAP:ALV GRID 信号灯例子
    SAP: ALVGRID 信号灯 例子Exception 用图形分段显示阶段性数据。ALV 字段由信号灯显示且根据特定字段变更其颜色。这个属性可以使最终用户容易识别紧急性、重要性数据。例如,在库存管理中将安全库存时设置为绿色,危险时为花色,超过安全库存时为红色。 书中仅写出核心代......
  • 在VMware Workstation虚拟机中利用Nvidia显卡的硬件加速功能
    研究了一下,在VMwareWorkstation虚拟机中利用Nvidia显卡的硬件加速功能,以下是详细的操作步骤:1.检查硬件和软件兼容性确认Nvidia显卡兼容性:访问Nvidia的官方网站,查阅支持列表,确认显卡型号支持虚拟机直通(Pass-Through)技术。https://developer.nvidia.com/zh-cn/cuda-gpusVMwar......
  • 在Linux中,RAID级别有哪些?
    RAID(RedundantArrayofIndependentDisks,独立磁盘冗余阵列)是一种将多个磁盘驱动器组合成一个逻辑单元的数据存储虚拟化技术,用于提高数据的可靠性、性能和/或容量。RAID有多种级别,每种级别都有其特定的性能、可靠性和成本效益。以下是一些常见的RAID级别:1.RAID0(条带化)特点:将......
  • 基于ADB Shell 实现的 Android TV、电视盒子万能遥控器 — ADB Remote ATV
    ADBRemoteATVAndroidTV的遥控器,基于ADBShell命令ADBRemoteATV是一个AndroidTV的遥控器,基于ADBShell命令,泛用性更高。下面的shell命令,是软件的基本原理,通过shell命令可模拟物理遥控器的基本按键,此外还可以快捷启动指定APP、借助手机软键盘输入中/英字符等。......