首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用表中的一个字段来存储来自两个不同潜在表的记录的ID引用是不是一种坏做法?

使用表中的一个字段来存储来自两个不同潜在表的记录的ID引用是一种不推荐的做法。

这种做法违反了数据库设计的范式化原则,具体来说是违反了第一范式(1NF)。第一范式要求每个属性都是原子的,即每个属性不能再分解为更小的数据项。将来自两个不同潜在表的记录的ID引用存储在一个字段中,违反了这个原则。

这种做法存在以下问题:

  1. 数据冗余:将同一个ID引用存储在多个记录中,导致数据冗余,增加了数据存储的空间消耗。
  2. 数据不一致性:如果其中一个潜在表的记录被删除或修改了,而另一个潜在表的记录没有相应更新,就会导致数据不一致性。
  3. 数据完整性:没有外键约束来确保引用的完整性,容易出现引用无效的情况。
  4. 查询效率低下:由于需要在一个字段中进行复杂的查询和连接操作,会导致查询效率低下。

相反,应该使用关系型数据库的关联表(或中间表)来解决这个问题。关联表是一个新的表,用于存储两个潜在表之间的关系。它包含两个外键,分别引用两个潜在表的记录。这样可以确保数据的一致性和完整性,并且查询效率也会更高。

对于这种情况,腾讯云提供了云数据库 TencentDB for MySQL 和 TencentDB for PostgreSQL,它们都支持关联表的设计和使用。您可以通过以下链接了解更多关于腾讯云数据库的信息:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

老程序员常用SQL语句优化技巧总结

①通过变量的方式来设置参数 好: stringsql = "select * from people p where p.id = ?..."; 坏: stringsql = "select * from people p where p.id = "+id; 数据库的SQL文解析和执行计划会保存在缓存中,但是SQL文只要有变化,就得重新解析...一般来说,如果使用UNION ALL能满足要求的话,务必使用UNION ALL。还有一种情况,如果业务上能够确保不会出现重复记录。...如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in: 例如:表A(小表),表B(大表) 1: select * from A where cc in (select cc...⑩复杂操作可以考虑适当拆成几步 有时候会有通过一个SQL语句来实现复杂业务的例子出现,为了实现复杂的业务,嵌套多级子查询。造成SQL性能问题。

92710

腾讯云TcaplusDB基础能力介绍

在扩容时,将该表分为两个分片,其中路由项0-5k放在Shard1 , 路由项5001-10k放在Shard2,2个shard分别存储到两个存储节点上。...对比过程因前端读写产品的不一致会根据记录修改时间自动判断并重复校验, 以发现系统潜在的不一致风险。 通常做法是抽查一些核心表的部分数据分片来进行全量比对,以保障比对效率。...推荐在一个XML文件中创建两种不同类型的表。 元素metalib是xml文件的根元素。另外,您可以使用union创建嵌套类型: 属性tagsetversion应该始终为1。...6 generic表主键字段 4 7 generic表非主键字段 128 8 list表组件字段 3 9 list表非主键字段 127 10 list表中的记录数 1024 11 表索引 8 12 字段长度...(亦称属性长度) 32B 13 主键字段长度 1KB 14 非主键字段长度 256KB 15 单记录大小 1MB 16 单索引关联记录数 无限制 17 单表允许分布的表格组数 (同一个表允许分布在一个表格组也可以分布在多个表格组

2.3K61
  • 服务器 数据库设计技巧--2

    13.避免频繁创建和删除临时表,以减少系统表资源的消耗。 14.临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。...我主张起单数表名,下面是来自《SQL Server 2000 宝典》的一段引用:主张用复数表名的阵营认为:表是由一组记录构成的,所以应当使用复数名词来命名它。...此时为了实现上面的关系,就需要一张解析表(这张表只存储学生ID和课程ID,而学生的信息和课程信息分别存在各自的表中),这个表的起名,建议的写法是将两个表的表名合并(如果表名比较长可做简化),此处如 StudentCourse...外键包含的字段的命名,外键包含的字段和外键是完全不同的概念。外键包含字段的命名,建议为:外键所在的表名 + Id。考虑这样一个关系,表Hotel,字段Id, Name, CityId。...表City,字段Id,Name。因为一个城市可能有好多家酒店,所以是一个一对多的关系,City是主表(1方),Hotel是从表(多方)。在Hotel表中,CityId是做为外键使用。

    1.3K90

    JNI开发中,你需要知道的一些建议

    GetFieldId获得字段ID 使用对应的方法(例如GetIntField)获取字段下面的值 类似地,要调用一个方法,使用者首先得获得一个类对象的引用,然后是方法ID(method ID)。...当一个类被加载时如果你想缓存些ID,而后当这个类被卸载后再次载入时能够自动地更新这些缓存ID,正确做法是在对应的类中添加一段像下面的代码来初始化这些ID: /* * 我们在一个类初始化时调用Native...相同对象的引用却可能具有不同的值。例如,用相同对象连续地调用NewGlobalRef得到返回值可能是不同的。为了检查两个引用是否指向的是同一个对象,使用者必须使用IsSameObject函数。...绝不要在Native代码中用==符号来比较两个引用。 得出的结论就是使用者绝不要在Native代码中假定对象的引用是常量或者是唯一的。代表一个对象的32位值从方法的一次调用到下一次调用可能有不同的值。...在连续的调用过程中两个不同的对象却可能拥有相同的32位值。不要使用jobject的值作为key. 使用者需要“不过度分配”局部引用。

    1.5K30

    SAP ETL开发规范「建议收藏」

    · 特定于环境的信息(即命名数据存储DS_EDW_DEV_1)。应该使用数据存储配置来配置环境信息,而不是通过为每个数据存储创建不同的名称。...3.5 Data Flows 一般而言,数据流应该被设计成将来自一个或多个源的信息加载到单个目标中。一个数据流通常不应该有多个表作为目标。例外情况是: 写出审计表(即写出行数)。...所有冗余代码(如无用转换或额外字段)应在释放之前删除。 通常,构建数据流的最有效方法是使用最少数量的变换。 有几种常见的做法可能会导致Dataflow设计中的不稳定性和性能问题。...避免这些问题的一些提示如下: 确保Dataflow中的所有源表都来自同一个数据存储,从而允许将整个SQL命令下推到数据库。...为确保所有SAP Data Services 作业都遵循一致的策略来存储作业参数,记录作业执行情况(包括消息,统计信息和错误处理),设计了一个框架。

    2.2K10

    数据库对象命名参考

    我主张起单数表名,下面是来自《SQL Server 2000 宝典》的一段引用: 主张用复数表名的阵营认为:表是由一组记录构成的,所以应当使用复数名词来命名它。...此时为了实现上面的关系,就需要一张解析表(这张表只存储学生ID和课程ID,而学生的信息和课程信息分别存在各自的表中),这个表的起名,建议的写法是将两个表的表名合并(如果表名比较长可做简化),此处如 StudentCourse...如果要逐条的写数据库操作的语句来完成一个业务规则,就使用存储过程。...表),就会误以为主键是针对字段的,即是说一个表上有两个主键,其实错了,只有一个主键,但包含了两个字段,这就是常说的复合主键。...外键的命名 外键的命名为 fk_外键所在的表名_外键引用的表名。因为外键所在的表为从表,所以上式可以写为 fk_从表名_主表名。 外键包含的字段的命名,外键包含的字段和外键是完全不同的概念。

    95720

    .Net中的反射(序章) - Part.1

    假如我们在建立一个酒店预订系统,那么酒店信息表(Hotel)就会引用此表,用CityId字段来引用酒店所在城市。...如同城市(City)表一样,在系统的其他表,比如说酒店订单表(HotelOrder)中,通过字段StatusId引用这个表来获取酒店预订状态。...我们使用DropDownList等控件获取表内容时,需要连接到数据库进行查询,潜在地影响性能。 同时,我们也注意到三点: 此表一般会在数据库联合查询中使用到。...在.Net FCL中,也经常能看到反射的影子,这里就向大家演示一个最常见的例子。大家知道,在CLR中一共有两种类型,一种是值类型,一种是引用类型。...现在假设我们需要比较两个对象是否相等。当我们比较两个引用类型的变量是否相等时,我们比较的是这两个变量所指向的是不是堆上的同一个实例(内存地址是否相同)。而当我们比较两个值类型变量是否相等时,怎么做呢?

    1.2K40

    SQL语句大全大全(经典珍藏版)

    –0 两个SOUNDEX 函数返回值的第一个字符不同 –1 两个SOUNDEX 函数返回值的第一个字符相同 –2 两个SOUNDEX 函数返回值的第一二个字符相同 –3 两个SOUNDEX 函数返回值的第一二三个字符相同...(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计 MAX(字段名) 取得一个表格栏最大的值 MIN(字段名) 取得一个表格栏最小的值 SUM(字段名) 把数据栏的值相加 引用以上函数的方法:...这里的存储过程也是自动化的一个方面,总之就是为了方便管理的一种措施。...首先创建一个存储过程(在pubs数据库中),我们命名为MyProce示例代码如下(功能为向stores表中插入stor_id,stor_name两个字段值): create procedure MyProce...下面我们再来看一个创建的例子(这个的作用是在authors表中查找一个人名,表中把一个名字分为两字段存储了,如果查到了,打印“查有此人ID:”及其au_id字段值): CREATE procedure

    1.4K10

    腾讯云TcaplusDB基础能力介绍

    对比过程因前端读写产品的不一致会根据记录修改时间自动判断并重复校验, 以发现系统潜在的不一致风险。 通常做法是抽查一些核心表的部分数据分片来进行全量比对,以保障比对效率。...推荐在一个XML文件中创建两种不同类型的表。 元素metalib是xml文件的根元素。另外,您可以使用union创建嵌套类型: 属性tagsetversion应该始终为1。...6 generic表主键字段 4 7 generic表非主键字段 128 8 list表组件字段 3 9 list表非主键字段 127 10 list表中的记录数 1024 11 表索引 8 12 字段长度...(亦称属性长度) 32B 13 主键字段长度 1KB 14 非主键字段长度 256KB 15 单记录大小 1MB 16 单索引关联记录数 无限制 17 单表允许分布的表格组数 (同一个表允许分布在一个表格组也可以分布在多个表格组...API Explorer 支持两种方式API调用:一种是根据输入参数自动生成对应语言的调用代码,可以把这些代码放到自己的云环境机器中调用,方便更灵活的使用API; 另一种是根据输入参数自动生成Http调用代码

    1.5K70

    精选MySQL面试题(附刷题小程序)

    枚举类型(ENUM),把不重复的数据存储为一个预定义的集合。 有时可以使用ENUM代替常用的字符串类型。 ENUM存储非常紧凑,会把列表值压缩到一个或两个字节。...索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。 索引是一种数据结构。...索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改。 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O。...行和列数据来自定义视图的查询所引用基本表,并且在具体引用视图时动态生成。 7.3 为什么要使用视图? 为了提高复杂SQL语句的复用性和表操作的安全性,MySQL数据库管理系统提供了视图特性。...如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。

    75230

    【MySQL】表的增删查改(进阶)

    mysql的数据量比较小,所有的数据都在一个mysql服务器上,自增主键是可以很好地工作的,如果mysql的数据量很大,一台主机放不下就需要进行分库分表,使用多个主机来进行存储。...id为1,被子表引用了,因此被约束,无法删除id为1的数据。 id为2,没有被引用,可以删除。 这是为什么呢?每次给子表插入数据,势必要在父表中查询一下这个id是否存在。...联合查询(多表查询) 实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积: 笛卡尔积是通过排列组合来的。 笛卡尔积得到一个更大的表。...但是如果表不是一一对应,内连接和外连接就有区别了。 左外连接:会把左表的结果尽量列出来,哪怕在右表中没有对应的记录,就使用NULL填充。...单行子查询:返回一行记录的子查询 任务:查询与“不想毕业”同学的同班同学 分析:先去查询不想毕业同学的班级id,再按照班级id来查询那些同学和他一个班。

    3.1K20

    MySQL查询索引分析

    场景: 前一段时间修改数据表时,给一个表添加一个datetime字段,当时遇到了一个问题:我是否需要给该datetime字段上加索引呢?...如果不给该字段加索引,当where语句中使用该字段时,会不会扫全表呢?如果给其加了索引,那么势必会带来一些开销,假如这个索引用不到的话,给其加了索引岂不是画蛇添足了呢?...不需要再读取完整的记录(Mysql一般会先从索引文件中读取要找的记录,然后根据索引再从数据表中读取真正的记录) 其他 在了解了自己表结构以及索引结构之后,通常可以使用explain语句来查看Mysql的查询执行计划...在执行该条查询语句时,真正选择使用的索引 rows字段:显示MySQL认为它执行查询时必须检查的行数,不是最后得出的结果的真实行数 Extra字段:显示Mysql解析查询时的详细信息,例如使用了哪一种索引合并优化算法...会先根据索引从数据表中读取出真实记录,然后根据table filter中的条件来过滤结果) 那么其实我们再回头来看之前那条SQL语句的执行时,已经很清晰的知道其进行查询时的一个大概过程: 首先从两个索引树中找数据

    2.2K60

    说烂嘴了的Explain执行计划,你不一定讲得清楚

    子句或操作表的顺序 三种情况: id相同: 执行顺序由上至下 id不同:如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行 id相同又不同(两种情况同时存在):id如果相同,可以认为是一组...如果将主键置于where列表中,mysql就能将该查询转换为一个const eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键 或 唯一索引扫描。...本质是也是一种索引访问,它返回所有匹配某个单独值的行,然而他可能会找到多个符合条件的行,所以它应该属于查找和扫描的混合体 range:只检索给定范围的行,使用一个索引来选择行。...rows:根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数 Extra:不适合在其他字段中显示,但是十分重要的额外信息 Using filesort :mysql对数据使用一个外部的索引排序...4(id = 1)、【select d1.name, … d2 from … d1】:select_type为PRIMARY表示该查询为最外层查询,table列被标记为 “derived3”表示查询结果来自于一个衍生表

    61720

    五年沉淀,微信全平台终端数据库WCDB迎来重大升级

    WCDB_FIELD(Sample::id),它既可以表示表中 id 这个字段,用来组成各种条件表达式,也可以用来访问Sample的实例中的id这个成员变量,进而可以实现将一个C++对象序列化写到数据库...在磁盘损坏这种低概率发生的场景,备份和修复方法还能应对,但是在外部逻辑出现Bug导致大规模写坏数据库的场景,就难以应对了。我们需要一种更主动的方法来防止数据库被写坏,防患于未然。...外部逻辑写坏数据库的情况会有两种,一种是误用了数据库的路径或者误删了数据库,这个很难出现,要保护也是通过hook系统调用的方式来做,无法集成在WCDB内部;另一种是误用了数据库的文件句柄,这种相对常见,...首先,如果一个表有字段配置了压缩字段的话,底下就会给这个表的压缩字段逐个添加一个对应的,存储压缩状态的字段,状态字段存储了是否压缩的状态,以及压缩所用的算法,然后还要预处理 SQL,把SQL 中对压缩字段的读写...只需要定义一个解压函数,它接收压缩字段和压缩状态字段来做解压,比如下面示例中的decompress函数,然后再把 SELECT/DELETE 语句中用到压缩字段的地方,全部替换成解压函数,这样就能把数据解压之后再使用

    78741

    五年沉淀,微信全平台终端数据库WCDB迎来重大升级!

    WCDB_FIELD(Sample::id),它既可以表示表中 id 这个字段,用来组成各种条件表达式,也可以用来访问Sample的实例中的id这个成员变量,进而可以实现将一个C++对象序列化写到数据库...在磁盘损坏这种低概率发生的场景,备份和修复方法还能应对,但是在外部逻辑出现Bug导致大规模写坏数据库的场景,就难以应对了。我们需要一种更主动的方法来防止数据库被写坏,防患于未然。...外部逻辑写坏数据库的情况会有两种,一种是误用了数据库的路径或者误删了数据库,这个很难出现,要保护也是通过hook系统调用的方式来做,无法集成在WCDB内部;另一种是误用了数据库的文件句柄,这种相对常见,...首先,如果一个表有字段配置了压缩字段的话,底下就会给这个表的压缩字段逐个添加一个对应的,存储压缩状态的字段,状态字段存储了是否压缩的状态,以及压缩所用的算法,然后还要预处理 SQL,把SQL 中对压缩字段的读写...只需要定义一个解压函数,它接收压缩字段和压缩状态字段来做解压,比如下面示例中的decompress函数,然后再把 SELECT/DELETE 语句中用到压缩字段的地方,全部替换成解压函数,这样就能把数据解压之后再使用

    1.5K21

    Uber为什么放弃Postgres选择迁移到MySQL?

    其他字段... 我们通过一个简单的用户表来解释这个。对于每个用户,我们都有一个自动递增的用户 ID 主键、用户的名字和姓氏以及用户的出生年份。...因此,我们可以这样考虑表的内部表示形式: 主键索引(将 id 映射到 ctid)的定义如下: B 树索引是在 id 字段上定义的,并且 B 树中的每个节点都存有 ctid 的值。...请注意,在这种情况下,由于使用了自动递增的 ID,B 树中字段的顺序恰好与表中的顺序相同,但并不是一直都这样。 二级索引看起来差不多,主要区别在于字段的存储顺序不同,因为 B 树必须按字典顺序来组织。...Postgres 使用另一个版本字段来确定哪个元组是最新的。数据库根据这个字段确定哪个元组对不允许查看新版本数据的事务可见。 在 Postgres 中,主索引和二级索引都直接指向磁盘上的元组偏移量。...MySQL 的逻辑复制格式还意味着存储引擎层中的磁盘变更不会影响复制格式。在进行 MySQL 升级时,典型的做法是一次将更新应用于一个副本,在更新完所有副本后,将其中一个提升为新的主副本。

    2.9K10

    零售商贩mysql表设计:banner管理表

    当可为NULL 的列被索引肘,每个索引记录需要一个额 外的字节,在 MyISAM 里甚至还可能导致固定大小 的索引 (例如只有一个整数列的 索引) 变成可变大小的索引。(为null是占用存储空间的。...当可为NULL 的列被索引肘,每个索引记录需要一个额 外的字节,在 MyISAM 里甚至还可能导致固定大小 的索引 (例如只有一个整数列的 索引) 变成可变大小的索引。(为null是占用存储空间的。...img_id是关联下面的图片image表的id字段. key_word type 是关联起来的,代表根据type的不同,跳向商品 专题 其他. banner_id关联banner表的id,这篇文字第一张表啦...img_id关联image表的id字段. image数据如下: 图片在image表中。...Banner位,通常位于界面的顶部,是广告、运营活动、专题、新产品推广等重要信息的展示区域,通过运营同学来进行内容信息的维护,运用视觉表现的手法突出重点信息,来吸引用户的关注。

    84310

    limit offset慢查询背后的原因与解法

    问题 问题起源于一个涉及到数据遍历的脚本。 该脚本会对一个MySQL表中的数据进行有条件的全表遍历。...其实原因也好理解,MySQL的数据存储并不是一个数组,可以直接根据下标获取第X位。即使给你搜索的字段加了索引,也只是使用该字段的值去建立一个新的二叉树(索引二叉树),来方便你快速找到数据位置。...是因为查询语句实际是由一个个算子组合起来的,比如有选择算子(where条件)、连接算子(join)、投影算则(select的字段)、数据源等,不同的算子有计算顺序,导致底层的算子是不知道上层计算条件的。...更多解法 其实可以选择的解法还有很多,比如从业务层面限制要访问的数据,比如分表,比如其他奇诡的索引用法。...此外,这里介绍的解法,也更多地针对MySQL默认使用的InnoDB引擎去做优化,在不同的数据库存储引擎下,可能会有其他更合适的解法。

    2.2K30

    数据库工程师常见面试题

    维护阶段是对运行中的数据库进行评价、调整和修改。 问题 4: 插入记录时可以不指定字段名称吗? 答: 不管使用哪种 INSERT 语法,都必须给出 VALUES 的正确数目。...Id 有多个记录,把所有这个 id 的记录查出来,并显示共有多少条记录数。...但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表, 并且在引用视图时动态生成。对其中所引用的基础表来说,视图的作用类似于筛选。...定义视图的筛选可以 来自当前或其它数据库的一个或多个表,或者其它视图。分布式查询也可用于定义使用多个异类源数据的 视图。...如果有几台不同的服务器分别存储组织中不同地区的数据,而您需要将这些服务器上相似结构的数 据组合起来,这种方式就很有用。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很 少。

    3K40

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券