多租户、反范式与文档模型

共 66 题
#

1. PostgreSQL 行级安全(Row-Level Security, RLS)策略的实现?

A RLS 在行级限制访问,通过 CREATE POLICY 定义使用条件,由数据库强制 ✓ 正确答案
B RLS 只能过滤列
C RLS 需要应用层配合
D RLS 与多租户无关
#

2. Schema-per-Tenant 的约束冲突,连接池、迁移成本?

A 迁移只需一次
B 连接池无需处理
C 每租户一个 schema,隔离好但连接池需按租户切换、DDL 迁移成本高 ✓ 正确答案
D 隔离性差
#

3. 共享表(Shared Table)多租户的取舍,tenant_id 列、行级安全(RLS)?

A 共享表无需 tenant_id
B 所有租户共享一张表,用 tenant_id 区分,配合 RLS 强制隔离 ✓ 正确答案
C RLS 无法用于共享表
D 共享表隔离性最好
#

4. 多租户场景下的资源竞争,连接池、CPU、I/O 争用?

A 资源竞争不存在
B 连接池、CPU、I/O 都可能被某个租户独占,需用资源限制与隔离缓解 ✓ 正确答案
C 连接池无需共享
D 慢查询不影响其他租户
#

5. 领域驱动设计(DDD)中的聚合根(Aggregate Root)、限界上下文(Bounded Context)如何映射到数据库?

A 聚合无需事务边界
B 聚合根映射为表,聚合内强一致、跨限界上下文用事件最终一致 ✓ 正确答案
C 所有上下文共享一张表
D 限界上下文与数据库无关
#

6. PostgreSQL RLS 的 CREATE POLICY 语法?

A WITH CHECK 过滤现有行
B USING 只用于 INSERT
C USING 过滤现有行,WITH CHECK 校验新写入的行 ✓ 正确答案
D 策略无需 FOR 子句
#

7. RLS 的 SELECT、INSERT、UPDATE、DELETE 策略?

A SELECT 用 USING,INSERT 用 WITH CHECK,UPDATE 同时用两者 ✓ 正确答案
B INSERT 用 USING
C SELECT 用 WITH CHECK
D DELETE 用 WITH CHECK
#

8. UUID 主键的分布式友好性与索引体积代价?

A 分布式友好、可离线生成,但体积大、随机性强导致索引碎片化 ✓ 正确答案
B UUID 体积小
C UUID 顺序写入
D UUID 不适合分布式
#

9. 主键的数据类型选择,INT vs BIGINT vs UUID vs 字符串?

A UUID 体积最小
B 字符串最适合做主键
C INT/BIGINT 性能好索引小,UUID 分布式友好但体积大,字符串一般不宜做主键 ✓ 正确答案
D INT 范围最大
#

10. 主键的物理顺序与聚簇索引的关系(InnoDB IOT)?

A InnoDB 是 IOT,数据按主键物理顺序存储,单调递增主键写入高效 ✓ 正确答案
B 主键不影响物理顺序
C 随机主键写入高效
D 二级索引叶子存主键值无需回表
#

11. 唯一键(UNIQUE)与主键的 NULL 处理差异?

A 主键允许 NULL
B 主键非空,唯一键允许 NULL,PostgreSQL 中多个 NULL 可共存 ✓ 正确答案
C 唯一键不允许 NULL
D 所有数据库唯一键都只允许一个 NULL
#

12. MySQL InnoDB 主键的聚簇影响?

A 数据按主键物理存储,二级索引叶子存主键值,主键应小且单调递增 ✓ 正确答案
B 主键不影响存储
C 二级索引无需回表
D 随机主键性能最好
#

13. UUID v4 与 v7 的索引写入性能?

A v7 时间有序大致单调递增,写入索引性能优于随机 v4 ✓ 正确答案
B v4 顺序性好
C v7 与 v4 完全随机
D v7 写入性能更差
#

14. 主键的 ALTER TABLE ADD PRIMARY KEY 的代价?

A 加主键不影响表结构
B 加主键无需锁表
C 加主键立即完成
D 大表加主键可能重建表或全表建索引,耗时且锁表,应建表时确定 ✓ 正确答案
#

15. 唯一约束的 NULL 处理(PG 多 NULL vs SQL Server 单 NULL)?

A 所有数据库都只允许一个 NULL
B PostgreSQL 允许多个 NULL,SQL Server 默认只允许一个 NULL ✓ 正确答案
C 所有数据库允许多个 NULL
D 唯一约束不允许 NULL
#

16. 反范式的优势,减少 JOIN、提升查询性能?

A 通过冗余减少 JOIN、提升查询性能,但需承担一致性维护成本 ✓ 正确答案
B 反范式减少冗余
C 反范式提升写入性能
D 反范式无需维护一致性
#

17. 反范式(Denormalization)的常见模式,冗余字段、派生列、预计算聚合?

A 冗余字段无需同步
B 冗余字段、派生列、预计算聚合都减少查询成本,但需维护一致性 ✓ 正确答案
C 派生列会自动更新
D 预计算聚合每次实时算
#

18. 预计算聚合表(Aggregate Table),物化视图、汇总表?

A 物化视图由数据库管理,汇总表由应用维护,都预存聚合结果提升查询性能 ✓ 正确答案
B 物化视图每次实时聚合
C 汇总表自动实时更新
D 预计算聚合只用于 OLTP
#

19. 星型模型(Star Schema)的反范式?

A 维度表无冗余
B 星型模型遵守 3NF
C 维度表扁平化冗余、减少 JOIN 层级,是 OLAP 的核心反范式设计 ✓ 正确答案
D 星型模型需多级 JOIN
#

20. 列数过多(PostgreSQL 1600 列限制)的存储开销,NULL bitmap?

A 列数过多增加行宽与 NULL bitmap 开销,PG 最多 1600 列 ✓ 正确答案
B NULL 列无任何成本
C 列数不影响行宽
D PG 无列数限制
#

21. 大宽表的查询优化,列裁剪(Column Pruning)、分区?

A 大宽表无需优化
B 列裁剪无效果
C 分区不能裁剪
D 列裁剪只读所需列、分区裁剪只扫相关分区,都能减少 IO ✓ 正确答案
#

22. 稀疏列的存储优化,稀疏列存储(sparse column)、EAV 模型?

A 稀疏列无优化
B EAV 查询简单
C 稀疏列存储、EAV、JSONB 都能避免大量 NULL 的浪费 ✓ 正确答案
D JSONB 无法处理稀疏数据
#

23. JSONB 与稀疏列的取舍?

A 属性多动态用 JSONB,属性少固定需约束用稀疏列 ✓ 正确答案
B JSONB 有强类型约束
C 稀疏列适合动态属性
D 两者完全相同
#

24. 稀疏列的 GIN 索引,大量 NULL/空值列如何用 GIN 索引加速查询,与 B-tree 在稀疏数据上的差异与代价?

A GIN 适合等值查询
B GIN 是倒排索引,只索引有值的键,适合稀疏/多值数据,但写入开销大 ✓ 正确答案
C B-tree 适合稀疏数据
D GIN 不索引 JSONB
#

25. PostgreSQL JSONB 与 MongoDB 的对比,查询语言、事务支持、索引?

A 两者查询语言相同
B PG 用 SQL+JSONB 操作符且 ACID 事务成熟,MongoDB 用 MQL 且事务语义较新 ✓ 正确答案
C MongoDB 事务比 PG 成熟
D PG JSONB 无索引
#

26. 关系数据库模拟文档数据库,JSONB 列、hstore?

A hstore 支持嵌套
B JSONB 不支持索引
C JSONB 是二进制 JSON 支持索引与查询,hstore 是简单键值对,二者都提供灵活 schema ✓ 正确答案
D JSONB 有强类型约束
#

27. 关系模型与文档模型的对比,结构化 vs 半结构化、JOIN 能力?

A 文档模型 JOIN 能力强
B 关系模型结构化强、JOIN 能力强、schema 固定,文档模型 schema 灵活、嵌套存储 ✓ 正确答案
C 关系模型 schema 灵活
D 两者模型相同
#

28. 文档模型的反范式与查询性能,嵌套 vs 引用?

A 嵌套无数据重复
B 嵌套读一次取回、无关联查询但数据重复,引用数据唯一但需多次查找 ✓ 正确答案
C 引用查询性能更好
D 嵌套与引用等价
#

29. 聚合根(Aggregate Root)的文档建模?

A 聚合根映射为文档,聚合内实体嵌套其中,利用文档原子性实现聚合内强一致 ✓ 正确答案
B 聚合内实体分开存储
C 聚合根无需文档
D 聚合间强关联
#

30. JSONB 的查询能力,@>、?|、jsonb_path_query 等操作符如何支撑半结构化查询,与关系列的查询能力边界在哪里?

A JSONB 支持外键
B JSONB 有强类型检查
C @>、?、jsonb_path_query 等操作符配合 GIN 支撑半结构化查询,但类型检查弱于关系列 ✓ 正确答案
D JSONB 查询速度总快于关系列
#

31. MongoDB 与 PostgreSQL 的事务对比?

A PG 支持完整 ACID 与多隔离级别,MongoDB 事务较新、隔离级别少 ✓ 正确答案
B MongoDB 事务与 PG 一样成熟
C PG 不支持事务
D MongoDB 无事务
#

32. MongoDB 的聚合管道与 SQL 的对比?

A 聚合管道用阶段的链式管道处理文档,与 SQL 的 WHERE/GROUP BY/JOIN 等对应 ✓ 正确答案
B 聚合管道不支持分组
C $lookup 相当于内连接
D SQL 比聚合管道更灵活
#

33. 关系数据库的 JSON 列索引?

A 可用 GIN 索引、表达式索引或虚拟列索引,针对特定键或操作符加速 ✓ 正确答案
B JSON 列无法建索引
C 普通 B-tree 可直接索引整个 JSON
D JSON 索引覆盖所有查询
#

34. Database-per-Tenant 的隔离性、性能、运维成本?

A 运维成本低
B 隔离性差
C 隔离性最好、无租户干扰,但运维成本高、需管理大量数据库 ✓ 正确答案
D 适合租户数极多场景
#

35. RLS 的绕过风险,超级用户、表 owner、FORCE ROW LEVEL SECURITY?

A 表 owner 不绕过 RLS
B RLS 绝对不可绕过
C 超级用户、表 owner、BYPASSRLS 角色可绕过 RLS,FORCE ROW LEVEL SECURITY 可约束 owner ✓ 正确答案
D FORCE 使 RLS 失效
#

36. 多租户数据隔离的三种模式,单数据库单 schema、单数据库多 schema、多数据库?

A 多库成本最低
B 共享表成本最低、多库隔离最强,按租户数与隔离要求选择 ✓ 正确答案
C 共享表隔离最强
D 三种模式隔离性相同
#

37. 多租户数据迁移的挑战,单 schema 迁移 vs 多 schema 迁移?

A 迁移无需考虑一致性
B 多 schema 迁移只需一次
C 单 schema 迁移最复杂
D 单 schema 迁移简单但影响所有租户,多 schema 迁移需遍历所有 schema、易遗漏 ✓ 正确答案
#

38. RLS 的会话设置(SET app.tenant_id)?

A 用 SET app.tenant_id 设置租户上下文,策略用 current_setting 读取,实现按租户隔离 ✓ 正确答案
B 会话变量无需设置
C current_setting 读取数据库配置
D RLS 策略无法引用会话变量
#

39. 领域事件(Domain Event)的存储?

A 事件只存内存
B 事件可序列化存入事件表,事件溯源以事件为数据源通过重放重建状态 ✓ 正确答案
C 事件溯源无需事件表
D 领域事件可变
#

40. 自然键与代理键(Surrogate Key)的取舍,业务变更对系统的影响?

A 代理键有业务意义
B 自然键稳定
C 代理键稳定无业务意义,业务变更不影响主键,自然键易受业务变化影响 ✓ 正确答案
D 自然键无需唯一约束
#

41. 派生列(Derived Column)的应用,用户统计、订单总金额?

A 派生列与源数据无关
B 派生列无法自动维护
C 派生列需每次实时计算
D 派生列存储可计算值加速查询,可用生成列由数据库自动维护一致性 ✓ 正确答案
#

42. 冗余字段的最终一致性,消息队列、CDC?

A 冗余字段无需同步
B 冗余字段自动一致
C 最终一致性即强一致
D 用消息队列、CDC 或批处理异步同步冗余字段,实现最终一致 ✓ 正确答案
#

43. 雪花模型(Snowflake Schema)的取舍?

A 雪花模型查询更快
B 雪花模型维度表进一步规范化,节省存储但查询需更多 JOIN、性能下降 ✓ 正确答案
C 雪花模型无冗余
D 雪花与星型相同
#

44. 大宽表与列存数据库的协同,Parquet、ORC、ClickHouse?

A 行存适合宽表分析
B 列存适合窄表
C Parquet 是行存格式
D 列存按列存储、列裁剪与高压缩,适合宽表,Parquet/ORC 是列式文件格式、ClickHouse 是列式数据库 ✓ 正确答案
#

45. 大宽表(Wide Table)的应用场景,数据仓库、用户画像、订单事实表?

A 大宽表加列容易
B 大宽表只用于 OLTP
C 大宽表用于数据仓库、用户画像、订单事实表,减少 JOIN 但加列成本高 ✓ 正确答案
D 大宽表字段少
#

46. 稀疏数据的 EAV 模型(Entity-Attribute-Value)的约束冲突?

A EAV 值可加非空约束
B EAV 有强类型约束
C EAV 查询简单
D EAV 灵活适合稀疏属性,但 value 无强类型、查询需自连接、约束弱 ✓ 正确答案
#

47. 何时使用文档数据库(MongoDB),可变 Schema、嵌套结构?

A 文档数据库适合强事务
B 可变 schema、嵌套结构、快速迭代时适合,强事务与复杂 JOIN 场景不适合 ✓ 正确答案
C 文档数据库适合复杂 JOIN
D 文档数据库 schema 固定
#

48. 文档数据库模拟关系数据库,嵌入式文档 vs 引用(DBRef)?

A 嵌入式文档无重复
B 嵌入式文档读一次取回但数据重复,引用(DBRef)数据唯一但需关联查询 ✓ 正确答案
C 引用无需查询
D 嵌入式与引用等价
#

49. MongoDB 在 OLTP 场景的取舍?

A MongoDB 事务强于 SQL
B 高吞吐、灵活 schema、单文档原子,但多文档事务较新、无强约束 ✓ 正确答案
C MongoDB 有强外键约束
D MongoDB 适合复杂 JOIN
#

50. PostgreSQL BYPASSRLS 属性的作用,拥有该属性的角色如何绕过行级安全(RLS)策略,与超级用户权限的差异及安全边界?

A 拥有该属性的角色绕过 RLS,但只授予需访问全部数据的角色,区别于超级用户 ✓ 正确答案
B BYPASSRLS 授予超级用户权限
C BYPASSRLS 不影响 RLS
D 普通角色应默认授予 BYPASSRLS
#

51. MySQL 多 schema 的限制?

A MySQL 跨库事务无限制
B MySQL 支持实例内多 schema 独立概念
C MySQL 中 schema 与 database 等价,多 schema 即多库,跨库查询与事务有限 ✓ 正确答案
D MySQL schema 与 PG 相同
#

52. RLS 与 ORM 的协同?

A 连接池无需处理租户上下文
B ORM 必须实现 RLS
C 应用设置租户上下文,RLS 在数据库层自动过滤,ORM 无需感知 RLS ✓ 正确答案
D RLS 与 ORM 冲突
#

53. tenant_id 列的设计准则?

A tenant_id 可不建索引
B tenant_id 应作索引前缀并强制查询条件,配合 RLS 保证隔离 ✓ 正确答案
C 查询可不带 tenant_id
D tenant_id 只用于展示
#

54. 多租户 SaaS 架构模式?

A 共享表成本最低、多库隔离最强,按租户数量与隔离要求选择 ✓ 正确答案
B 多库成本最低
C 共享表隔离最强
D 只能选一种模式
#

55. 雪花 ID 的趋势递增特性与索引性能?

A 雪花 ID 由时间戳+机器+序列号组成,趋势递增,对索引写入友好 ✓ 正确答案
B 雪花 ID 完全随机
C 雪花 ID 与 UUID v4 相同
D 雪花 ID 无分布式能力
#

56. INT 与 BIGINT 的选择?

A INT 范围最大
B INT 省空间但约 21 亿上限,BIGINT 范围大,数据量大或分布式时用 BIGINT ✓ 正确答案
C BIGINT 与 INT 相同
D 分布式用 INT
#

57. Snowflake ID 的时钟回拨?

A 时钟回拨可能导致 ID 重复,需检测并等待或拒发,保证唯一性 ✓ 正确答案
B 时钟回拨不影响 ID
C 雪花 ID 无时钟依赖
D 时钟回拨只影响性能
#

58. UUID v7 与雪花 ID 的对比?

A UUID v7 是 64 位
B UUID v7 是 128 位标准 ID,雪花 ID 是 64 位可自定义,两者都趋势递增 ✓ 正确答案
C 雪花 ID 是 128 位
D 两者都随机无序
#

59. 主键与 UUID v1 的隐私问题?

A UUID v1 与 v4 相同
B UUID v1 完全随机
C UUID v1 含 MAC 地址会泄露机器信息,对外暴露主键时不应使用 ✓ 正确答案
D UUID v1 无隐私风险
#

60. OLTP 与 OLAP 的范式差异?

A OLTP 用反范式
B OLTP 高范式保证一致性,OLAP 反范式(星型/宽表)提升查询性能 ✓ 正确答案
C OLAP 用 3NF
D 两者范式相同
#

61. EAV(实体-属性-值)模型的查询复杂度,动态属性带来的多表连接与类型转换代价,何时该用 JSONB 或宽表替代?

A EAV 多属性需自连接与类型转换、查询复杂,属性适中时用 JSONB 或宽表替代 ✓ 正确答案
B EAV 查询简单
C EAV 无需类型转换
D EAV 适合属性多且固定的场景
#

62. 宽表在 ETL 中的处理策略,动态加列对管道的影响、Schema-on-Write 与 Schema-on-Read 的取舍,以及列裁剪与行存/列存的选择?

A 动态加列影响管道,Schema-on-Read 更灵活,分析场景用列存作列裁剪 ✓ 正确答案
B 列存适合点查
C Schema-on-Write 更灵活
D 动态加列不影响管道
#

63. 宽表的分桶(Bucketing)?

A 分桶无优化作用
B 分桶与分区相同
C 分桶按列值分目录
D 分桶按哈希把数据分成固定桶数,可加速 JOIN 与抽样、减少数据倾斜 ✓ 正确答案
#

64. 稀疏列的存储格式(Parquet)?

A Parquet 是行存格式
B Parquet 列存 + 压缩让稀疏列 NULL 几乎不占空间,列裁剪只读所需列 ✓ 正确答案
C Parquet 对稀疏列无优化
D Parquet 必须读全列
#

65. JSON Schema 在数据库中的应用,用 CHECK 约束与 jsonb_typeof 保障半结构化数据质量,与文档数据库的 schema 校验差异及适用场景?

A CHECK 约束不支持 JSONB
B JSONB 无法加约束
C jsonb_typeof 只用于查询
D 用 CHECK 约束 + jsonb_typeof 校验 JSONB 类型,保障半结构化数据质量 ✓ 正确答案
#

66. 文档模型的 Schema 演进?

A 文档模型字段增减无需迁移整表、演进成本低,但需校验器控制数据质量 ✓ 正确答案
B 文档模型演进需重建整表
C 文档模型有强制 schema
D 文档模型无法演进