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

在SQL表中使用通用ID列是个坏主意吗?

在SQL表中使用通用ID列是一个具有争议的问题。通用ID列是指在一个表中使用一个统一的ID列来表示多个实体的唯一标识。以下是对这个问题的完善且全面的答案:

概念:

通用ID列是一种设计模式,旨在简化数据库模式并减少表之间的关联。它通过在一个表中使用一个统一的ID列来代替多个表中的不同ID列,从而实现对多个实体的唯一标识。

分类:

通用ID列可以分为两种类型:自增ID和全局唯一ID。自增ID是指在每次插入新记录时自动递增的整数值,而全局唯一ID是指使用全球唯一标识符(UUID)或其他算法生成的字符串。

优势:

  1. 简化数据库模式:使用通用ID列可以减少表之间的关联,简化数据库模式,使得数据库结构更加清晰和易于维护。
  2. 提高性能:通用ID列可以减少表之间的连接操作,从而提高查询性能。
  3. 灵活性:通用ID列可以轻松地添加新的实体类型,而无需修改数据库结构。
  4. 数据隔离:使用通用ID列可以将不同实体类型的数据存储在同一个表中,从而实现数据的隔离和分区。

应用场景:

通用ID列适用于以下场景:

  1. 多实体类型的关联:当多个实体类型之间存在复杂的关联关系时,使用通用ID列可以简化数据库模式。
  2. 动态实体类型:当实体类型是动态变化的,即可能随时添加新的实体类型时,使用通用ID列可以提供更大的灵活性。
  3. 数据隔离和分区:当需要将不同实体类型的数据进行隔离和分区时,使用通用ID列可以简化数据管理。

推荐的腾讯云相关产品和产品介绍链接地址:

腾讯云提供了一系列与数据库相关的产品,包括云数据库SQL Server、云数据库MySQL、云数据库MongoDB等。这些产品可以满足不同场景下的数据库需求,具体详情请参考腾讯云官方网站的相关产品介绍页面。

总结:

在SQL表中使用通用ID列是一个具有争议的设计选择,它具有简化数据库模式、提高性能和灵活性的优势,适用于多实体类型的关联、动态实体类型和数据隔离等场景。然而,使用通用ID列也可能导致数据冗余和复杂的查询逻辑。因此,在决定是否使用通用ID列时,需要综合考虑具体的业务需求和数据库设计原则。

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

相关·内容

笨办法学 Python · 续 练习 40:SQL 读取

你在编程处理图, SQL 处理。他们相关的概念,但心智模型不同的。 这里例子,它们哪里不一样。假设你想知道 Zed 拥有什么宠物。...你需要写一SELECT,person查找,然后“以某种方式”找到我的宠物。为此,你必须查询person_pet来获取所需的id。...ex6.sql:1 我仅仅想要pet的一些,所以我选择中指定它们。在上一练习,你使用*来表示“每一”,但它在这里坏主意。...相反,你想要明确地指定你想要的每个的哪个,你可以使用table.column实现它,就像pet.name。...ex6.sql:2 为了将pet连接到person,我需要遍历person_pet关系 SQL ,这意味着我需要在FROM之后列出所有三。 ex6.sql:3 WHERE子句的开始。

51820
  • 网站渗透攻防Web篇之SQL注入攻击中级篇

    UNION运算符来添加一任意查询,来提取数据,是不是很容易啊,当然使用UNION之前我们必须要满足两条件: 两查询返回的数必须相同两查询语句对于返回的数据类型必须相同 首先我来看第一条件...MySQL,这些都保存在information_schema数据库 第一步:提取数据库 MySQL,数据库名存放在information_schema数据库下schemataschema_name...字段 id=1 union select null,schema_name,null from information_schema.schemata 第二步:提取MySQL名存放在information_schema...第三步:提取字段名 MySQL,字段名存放在information_schema数据库下columnscolumn_name字段 同样加上where子句限制,不让你都不知道字段名哪个数据库哪个下...3.4、窃取哈希可令 MySQLmysql.user存储哈希口令,怎么提取看下图: 哈希口令通过使用PASSWORD()函数计算的: 具体算法取决于MySQL安装的版本。

    1.7K10

    如何编写便于团队阅读和维护的SQL语句

    由于SQL语句学习简单,表达能力强,上手容易的有点,所以在数据处理SQL语句就成为了最通用的和最优先考虑处理方式。大数据 SQL 应用主要分两种:一种周期性的统计任务,另一种分析任务。...1、关键字使用大写 SQL关键字使用大写,使用小写(oracle除外,oracle默认就是大写)。SQL函数都使用大写这样可以进行更好的区分,尽管这里有一些争议,但是我建议这样使用。...3、使用别名提高可读性 添加别名为明确含义说明的方法。当的名称没有意义时,请给它们加上别名,尤其包含子查询的时候(Hive中子查询必须有别名),这样可以使得阅读SQL时更加的方便。...这样看起来会更加的方便,尤其搜索代码的时候。 4、使用缩进和空格 尽管这是一基本原则,但它能让你的代码更具可读性。与使用python一样,应该对SQL代码进行缩进。...并且如果你不写注释,3月前的代码你还记得思路? 注释帮助我们回忆思路和逻辑的重要手段,但是我们也不能写太多,我们写的注释,不是论文。

    1K20

    Oracle总结【视图、索引、事务、用户权限、批量操作】

    前言 Oracle总结的第一篇,我们已经总结了一些常用的SQL相关的知识点了…那么本篇主要总结关于Oralce视图、序列、事务的一些内容… 在数据库,我们可以把各种的SQL语句分为四大类… (1)...,真正的数据还是存储 (6)程序员虽然操作的视图,但最终视图还会转成操作基 (7)一可以有0或多个视图 为什么要用到视图?...Oracle使用序列这么一对象…. (1)类似于MySQL的auto_increment自动增长机制,但Oracle无auto_increment机制 (2)oracle提供的一产生唯一数值型值的机制...不会 hibernate,如果访问oracle数据库服务器,那么User.hbm.xml映射文件关于标签如何配置呢?...可以Oracle创建新的普通用户,创建普通用户命令:create user,创建普通用户的同时,应该为其分配一具体的空间,通常叫users。

    2K41

    使用连接组优化连接 (IM 6)

    注: 一不能多个连接组的成员。 创建连接组时,数据库使连接组引用的的当前内存内容无效。 随后的重新填充会导致数据库使用通用字典重新编码表的IMCU。...连接组的好处: 数据库对压缩数据进行操作。 基于连接组的Hash连接,数据库使用数组而不是构建Hash。 数据库将每个连接值的代码存储通用字典( common dictionary)。...03连接组如何工作 连接组,数据库使用相同的通用字典压缩连接组的所有。 本节包含以下主题: 主题: 连接组如何使用通用字典 一通用字典级的,特定于实例的字典代码集合。...连接组如何优化扫描 关键优化加入通用字典代码而不是值,从而避免使用散列表进行连接。 连接组如何使用通用字典 一通用字典级的,特定于实例的字典代码集合。...示例6-3监视连接组 本例,您将在sh.products和sh.sales的 prod_id列上创建一连接组,然后该列上连接这些。 您的目标确定连接查询是否使用了连接组。

    1.2K30

    2022年Java秋招面试必看的 | MySQL调优面试题

    MySQL 使用以下代码查询显示前 50 行: SELECT*FROM TABLE LIMIT 0,50; 17、可以使用多少列创建索引? 任何标准最多可以创建 16 索引。...1、TINYTEXT 2、TEXT 3、MEDIUMTEXT 4、LONGTEXT 20、什么通用 SQL 函数? 1、CONCAT(A, B) – 连接两个字符串值以创建单个字符串输出。...Mysql 数据库软件客户端或服务器系统,其中包括:支持各种客户端程序和库的多线程 SQL 服务器、不同的后端、广泛的应用程序编程接口和管理工具。 43、Heap 是什么?...ENUM 字符串对象,用于指定一组预定义的值,并可在创建使用。...图片 86、什么样的对象可以使用 CREATE 语句创建? 图片 87、Mysql 中允许有多少 TRIGGERS? 图片 88、什么是非标准字符串类型? 图片 89、什么通用 SQL 函数?

    2.8K30

    DBA-MySql面试问题及答案-下

    30.可以使用多少列创建索引? 31.NOW()和CURRENT_DATE()有什么区别? 32.什么是非标准字符串类型? 33.什么通用SQL函数?...) ); B + 树左小右大的顺序存储结构,节点只包含 id 索引,而叶子节点包含索引和数据,这种数据和索引在一起存储的索引方式叫做聚簇索引,一张只能有一聚簇索引。...Mysql使用以下代码查询显示前50行: SELECT*FROM LIMIT 0,50; 30.可以使用多少列创建索引? 任何标准最多可以创建16索引。...因此,在这种情况下,能被存储salary的值的范围从-9999999.99到9999999.99。 35.mysql有关权限的都有哪几个?...主键,一种特殊的唯一索引,一张只能定义一主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建。

    22120

    Citus 11 官方手册脑图 - PostgreSQL 超大规模分布式数据库解决方案上手指南

    选择分布键 确定的类型 为迁移准备源 添加分布键 回填新创建的 准备申请 Citus 设置 Development Citus 集群 包含分布 向查询添加分布键 Ruby on Rails...FAQ 常见问题 我可以分布式上创建主键?...我忘记了的分布,如何找到? 我可以通过多个键分发表? 为什么 pg_relation_size 报告分布式的零字节?...我可以 Microsoft Azure 上运行 Citus ? 对于多租户应用程序,我可以 Citus 上按 schema 分片? cstore_fdw 如何与 Citus 一起工作?...一带有 HLL 的汇总表胜过一千没有 HLL 的汇总表 想了解更多关于 Postgres 的 HLL 的信息

    4.3K30

    《深入浅出SQL》问答录

    像这样? : ? 这样要执行n次啊。。。 那有没有更好的办法,其实在主语言中,这不过就是分支语句的事情嘛,奈何SQL语言我不熟啊。。。...A:外键为NULL,表示没有相符的主键。但我们可以确认外键包含有意义、已经存储的值,请通过约束实现。 不能单纯的使用另一张的键,称之为外键,而不加上约束?...创建别名真的很简单,查询软件首次使用原始列名的地方后接一AS并设定要采用的别名,告诉软件现在开始要以另一名称引用my_contacs的profession,这样可以让查询更容易被我们理解。...A:大多数情况下,内层查询只能返回单一值,也就是一里的一行。而后,外层查询才能利用这个值与其他值进行比较。 一般而言,子查询必须返回一值,使用IN例外情况。...UNION 还有一种取得多张的查询结果的方式:UNION联合。 UNION根据我们SELECT中指定的,把两张或更多张的查询结果合并至一

    2.9K50

    笨办法学 Python · 续 练习 39:SQL 创建

    ex1.sql:2 id,它用于准确确定每一行。的格式NAME TYPE,并且这里我假设,我需要一INTEGER也是PRIMARY KEY。这样做告诉 SQLite3 来将其特殊对待。...ex1.sql:6 使用圆括号结束的列表,之后分号(;)。 创建多表的数据库 创建一不是特别实用。我希望你现在创建三,你可以在里面储存数据。...第七行的第二版本是一缩写版本,它不指定,而是依赖于的隐式顺序。这种形式危险的,因为你不知道你的语句实际访问哪一,并且某些数据库对没有可靠的排序。当你真的很懒惰时,最好只用这种形式。...我使用我想要的person的行id(这里0),和我想要的pet的行id(同样,0独角兽,1死去的机器人)。然后,我们向person_pet关系插入一行,用于人与宠物之间的每个“连接”。...使用这张,一只宠物可以被多于一人拥有?这在逻辑上可能的?家养的狗如何呢?严格来说,家庭的每个人不是拥有它

    90820

    饿了么元数据管理实践之路

    三、饿了么部分使用场景 下面饿了么元数据应用上的部分场景: ?...提供动态的依赖血缘关系查询。节点基础信息,节点之间的边Operation信息,同时附加任务执行Id、执行时间等属性。血缘结构展示等同血缘结构。 ?...Q & A Q1:咱们的数据生命周期如何管理的,能具体说下? A:级数据进行热度分析,比如近三月没人访问,是否可以下线,特别是一些临时 需要定时清理。...Q3:把从SQL的埋点数据存储到MySQL如何规划的?这些埋点信息不应该像是日志数据一样被处理?存储MySQL有自增全局ID的么?...A:对的,线上还是线下,任务调度系统埋点,临时根据temp就知道了。 Q7:数据血缘关系如果使用Hive hook方式获取,需要在每个执行节点中做捕捉

    5.1K43

    异构数据源同步之数据同步 → DataX 使用细节

    Reader 数比 Writer 少 同样会同步异常,提示信息类似如下 配置信息有错误. 因为您配置的任务,源头读取字段数:4 与 目的要写入的字段数:5 不相等....和 Writer 都支持配置多个,但需要保证这些同一 schema 结构 个人非常不推荐一 job 配置多个 table,而是一 job 一 table,如果需要同步多个 table,那就配置多个...1 ,则对每个 table 分成 job.setting.speed.channel 片,每片对应一 task 不推荐大家 job 配置多个,所以这种情况了解就好 比较可惜的,目前...其实我们仔细思考下就明白了,我们之所以认为 where id IS NULL 没必要存在的原因我们知道 id 主键,但 DataX 知道,它不知道,所以需要 where id IS NULL 来保证数据不被遗漏...不过话说回来,数据量少的时候,不分片效率比分片要高,这又回到了那个老生常谈的问题了 多线程一定比单线程效率高 where 同样只针对 Reader 同 SQL 的 WHERE 一样,筛选条件

    1.2K10

    学习 MySQL 需要知道的 28 小技巧

    6、DISTINCT 可以应用于所有的? 查询结果,如果需要对进行降序排序,可以使用 DESC,这个关键字只能对其前面的 进行降序排列。...函数: 只能通过 return 语句返回单个值或者对象; 限制比较多,不能用临时,只能用变量,还有一些函数都不可用等等; 可以嵌入 SQL 语句中使用,可以 SELECT 语句中作为查询语句的一部分调用...16、存储过程的参数不要与数据的字段名相同。 定义存储过程参数列表时,应注意把参数名与数据库的字段名区别开来,否则将出 现无法预期的结果。 17、存储过程的参数可以使用中文?...(view)基本之上建立的,它的结构(即所定义的)和内容(即所有记录) 都来自基本,它依据基本存在而存在。...mysqldump 备份的文本文件实际数据库的一副本,使用该文件不仅可以 MySQL 恢复数据库,而且通过对该文件的简单修改,可以使用该文件 SQL Server 或者 Sybase 等其他数据库恢复数据库

    1.1K21

    PingCAP刘奇:如何构建一NewSQL数据库

    首先,它必须支持SQL,因为这数十年来我们一直使用SQL,而且许多应用程序都使用SQL,故而不能轻易将其舍弃。...✦TiDB如何使SQL与KV相匹配 让我们用一例子来展示一SQL 如何映射成KV对的。 假设我们的数据库里有一张简单的用户。它有一行三:nickname、email和age。...= kv.Get( ” user/bob/age ” ) 这就是使用字符串的通用KV数据库的存储方式。...TiDB内部,每个,每一都有一唯一的ID。所以TiDB使用ID以及ID来取代字符串。...因此TiDBid1,nicknameid为2,emailid为3,ageid则为4,而这一TiDB表显示如下: Key (table id/row id/column id) Value

    1.4K100

    学习 MySQL 需要知道的 28 小技巧

    6、DISTINCT 可以应用于所有的? 查询结果,如果需要对进行降序排序,可以使用 DESC,这个关键字只能对其前面的 进行降序排列。...函数: 只能通过 return 语句返回单个值或者对象; 限制比较多,不能用临时,只能用变量,还有一些函数都不可用等等; 可以嵌入 SQL 语句中使用,可以 SELECT 语句中作为查询语句的一部分调用...16、存储过程的参数不要与数据的字段名相同。 定义存储过程参数列表时,应注意把参数名与数据库的字段名区别开来,否则将出 现无法预期的结果。 17、存储过程的参数可以使用中文?...(view)基本之上建立的,它的结构(即所定义的)和内容(即所有记录) 都来自基本,它依据基本存在而存在。...mysqldump 备份的文本文件实际数据库的一副本,使用该文件不仅可以 MySQL 恢复数据库,而且通过对该文件的简单修改,可以使用该文件 SQL Server 或者 Sybase 等其他数据库恢复数据库

    1K40

    MySQL面试题(最全、超详细)——定位慢查询、聚簇索引、覆盖索引、深分页优化、sql优化、并发事务问题、隔离级别、undo log与redo log、主从同步

    四、索引4.1 索引项目中的使用方式4.2 了解过索引(什么索引)4.3 索引的底层数据结构了解过4.5 B树和B+树的区别是什么呢4.6 什么聚簇索引、什么二级索引(非聚簇索引),什么查询...九、解释一下MVCC十、MySQL主从同步原理十一、你们项目用过分库分一、MySQL,如何定位慢查询聚合查询多表查询数据量过大查询深度分页查询表象:页面加载过慢、接口压测响应时间过长(超过1s...存储引擎的特点1)介绍InnoDB一种兼顾高可靠性和高性能的通用存储引擎, MySQL 5.5 之后,InnoDB默认的 MySQL 存储引擎。...非聚簇索引: 非聚簇索引就是以非主键创建的索引,叶子节点存储的主键和索引。...(先走二级索引找到主键值,再根据主键值到聚集索引中找到对应的行数据)4.7 什么覆盖索引覆盖索引指查询使用了索引,并且需要返回的 该索引全部能够找到。

    42030

    你真的会玩SQL?表表达式,排名函数

    表表达式 期待单个值的地方可以使用标量子查询 期待多个值的地方可以使用多值子查询 期待出现的地方可用值子查询或表表达式 1.派生 从查询表达式派生出虚拟结果的表表达式,派生的存在范围只是外部查询...使用形式:from 派生 as 派生表列名 规则: 所有必须有名称 列名必须唯一 不允许使用order by(除非指定了top) 不同于标量和多值子查询,派生不能相关的,它必须独立的。...= b.Id   ORDER BY a.Id DESC --SELECT * FROM CTE_Test 再查询一次会报错 递归公用表达式 来引用他人的一示例: 先建一张栏目如下,栏目Id,栏目名称...order by子句中定义的列上,如果返回一行数据与另一行具有相同的值,rank函数将给这些行赋予相同的排名数值。排名的过程,保持一内部计数值,当值有所改变时,排名序号将有一跳跃。...在此方案,我们有Col1,Col2以及包含这个两重复数的,对于不同的查询,这个重复数的可能有不同的值。另一点需要注意的,一旦CTE被创建,DELETE语句就可以被运行了。

    1.9K90

    以12c Identity类型示范自我探索式学习方法

    错误信息的解析非常明确地告知“试图创建一通用用户,必须要用C## 或者c##开头”,这时候心里会有疑问,什么common user?...无法使用startup命令。原因使用了旧版本的SQL*Plus(如上所示10.2.0.4.0)连接到12c数据库的PDB,某些新特性不被支持。...SQL> GRANT dba TO kamus; GRANT succeeded. 那么PDB可以看到多少用户呢?可以看到CDB的用户?...这又是一简单的联想,学习的过程其实是一发散再收缩的循环。看来不可以,只能看到自己的用户,当然这里有很多common user。可以看到即使PDB,cdb_视图也是可以使用的。...11gR2,错误信息编号ORA-32790和ORA-32800之间空白,而12c使用了这其间的8错误号作为新特性的报错。

    1.1K40

    【呕心总结】python如何与mysql实现交互及常用sql语句

    2、 python 脚本,我采用 pymysql 和 sqlalchemy 这两库与 mysql 建立连接,用 pandas 来处理数据。...pd.io.sql.to_sql() 的参数还有许多其它用途,但上面这种我个人使用最高频的。效果:无需自己提前建,将自动建新。美中不足属性自动生成,通常不合心意,还需检查和修改。...我最初一月的实践,最常出现的错误有: 值的引用没有加上引号; 符号错乱:多一符号,少一符号; 值的类型不符合:不管 mysql 表格该值数,还是文本,定义 sql 语句的字符串时,对每个值都需要转化为字符串...三、sql语句:修改属性 横向的一整条数据,叫做行;竖向的一整条数据,叫作的名字,叫做 column,这是通用的知识点。 这段时间的实战,我完全没有用到修改的名称、重设index等知识点。...删除整张表格:你认真的?没有写错表格名字吧?! 做这项操作前,必须确认清楚自己的意图,毕竟一旦发生,无可挽回。 如果条件留空,将保留结构,而删除所有数据行。

    3K21
    领券