DB/Schema 设计原则

Database / Schema 设计原则

ProtonBase 完全兼容PG生态,因此在数据的管理组织方式上也分为数据库 (database) 、模式 (schema) 和表(table) 三级。这种设计对于确保系统的可维护性、可扩展性和性能至关重要。设计良好的数据库和模式结构能够帮助减少复杂性、提高性能并确保数据的完整性和安全性。

以下是 ProntonBase 中关于数据库和模式设计的一些主要原则。

数据库设计原则

明确数据库的职责

  • 每个数据库应承担一个清晰的角色。例如,一个数据库可以专门用于事务性数据,另一个可以用于分析任务。这有助于避免混合不同类型的数据和应用程序逻辑,减少管理复杂性。

合理的数据库分离

  • 将不同的应用程序或模块的数据存储在不同的数据库中。如果多个应用共享数据库,可能会导致数据访问冲突或复杂的事务管理问题。划分明确的数据库边界有助于简化管理、备份和恢复流程。

遵循数据冗余最小化原则

  • 在数据库中避免不必要的数据冗余。可以使用范式化技术来减少冗余数据的存储,并确保数据一致性。

选择合适的数据类型

  • 使用最适合业务需求的数据类型。例如,避免将整数类型的数据存储为字符串类型,这不仅能节省存储空间,还能提高查询效率。

数据库的可扩展性和性能

  • 随着数据量的增加,数据库可能面临性能瓶颈。因此,在设计时要考虑查询性能、索引、分区等方面的优化。同时要确保数据库可以随着需求增长而进行扩展。

数据库安全性

  • 避免将所有用户都赋予过多权限。通过合理的角色和权限管理,确保数据的安全性。

  • 同一个ProtonBase实例下,不同database是不能相互访问的,即独立的。

模式 (Schema) 设计原则

合理组织数据库对象

  • ProtonBase 中的模式 (schema) 用于将数据库对象 (如表、视图、索引等) 进行逻辑分组。合理的模式设计有助于管理复杂性,提升查询和维护的效率。

  • 通常情况下,可以根据业务模块、功能或者应用的不同划分不同的 schema。例如,财务模块的数据可以放在一个 finance schema 中,用户模块的数据可以放在 users schema 中。

避免模式过度划分

  • 虽然将对象分布到多个模式中有助于隔离和组织数据,但过度划分也会增加管理复杂度。对于小型应用或没有复杂模块的系统,可以选择使用少数几个模式,甚至全部对象放在 public 模式下。

标准化模式命名

  • 采用统一、描述性的命名规范。例如,可以根据功能或领域划分不同的 schema,如 accountinginventorymarketing 等。

控制对 schema 的访问权限

  • 在 ProtonBase 中,可以为不同的模式分配不同的访问权限,这样可以限制某些用户只能访问特定的模式。这种设计有助于实现不同用户或应用间的权限隔离。

表与模式的耦合

  • 同一个数据库,不同模式下的表是可以相互访问,即可共享的。

  • 不同模式下,表名可以是一样。也就是表在模式下是独立。

  • 在同一模式下的表应该具备较高的耦合度,即它们之间有相对紧密的关联。表的设计应尽量避免跨模式频繁的连接操作,这会影响查询性能。

避免跨模式依赖

  • 虽然 ProtonBase 允许跨模式访问,但为了避免复杂性,最好尽量减少不同模式之间的依赖关系。跨模式依赖可能会导致代码或查询的维护和迁移变得复杂。

最佳实践

谨慎使用 public 模式

  • ProtonBase 默认创建一个 public 模式。虽然可以将所有对象放入该模式,但随着系统变得复杂,最好创建自定义的模式来组织不同的数据集。

使用分区 (Partitioning)

  • 对于大规模数据表,考虑使用 ProtonBase 的分区功能。分区可以提高大数据集的管理和运维效率,在做定期滚动删除时性能比较高。例如,按日期或地理位置等字段分区。

合理使用索引

  • 索引对于查询性能至关重要,但索引会占用磁盘空间并影响写入操作的性能。设计时要根据常用查询模式合理选择索引。

关注数据库的备份与恢复策略

  • 数据库的设计应考虑到备份、恢复和灾难恢复策略。例如,考虑将数据库分为多个逻辑单元 (schemas),这样在发生故障时,能够快速恢复某个业务模块而不是整个数据库。

定期进行清理

  • 在数据库设计中应考虑数据的生命周期管理。例如,通过设置合理的归档、删除策略以及触发器,来确保数据库不会被过时的数据所填满。

总结

良好的数据库和模式设计不仅能提高性能、简化维护,还能增强系统的可扩展性和安全性。设计时要考虑到不同的业务需求、数据规模、查询模式以及数据访问权限,避免过度复杂化,同时注重合理的组织结构和命名规范。