我正在使用 PostgreSQL 并为应用程序设计关系数据库模式,在该应用程序中,我想将系统定义(内置)数据和用户定义(自定义)数据存储在多个表中,例如:
产品类别
ID | 姓名 | 组织 ID |
---|---|---|
0 | 蔬菜 | 068fd6a5-1c93-493f-9ffc-93a52de02aa8 |
1 | 奶制品 | 068fd6a5-1c93-493f-9ffc-93a52de02aa8 |
系统定义的数据是预先填充的,用户不应改变,而用户定义的数据可以由用户创建、修改和删除。我需要能够分别查询系统和用户数据,并且希望客户端保持沉默。
我考虑过以下方法:
- 添加一个布尔列(例如
is_system
)来指示数据是系统定义的还是用户定义的,但是考虑到系统定义的记录百分比极低,我不确定这是否是一个好主意。 - 对系统定义和用户定义的数据使用单独的表,即使结构几乎相同。我觉得这不对,因为数据本质上是相同的。
- 添加“系统拥有”的组织,并使用其 ID 识别系统定义的数据。客户端将不再那么笨,因为现在如果他们想要查询系统数据,他们就得记住一个 ID。
通常推荐哪种方法?我还应该考虑其他策略吗?
感谢您的见解。
由于您关心的是安全性,即限制谁可以对不同的数据做什么,最简单的是您的第二个选择:将您的“系统”数据保存在单独的表中,并设置不同的访问控制。例如,将它们保存在单独的架构中 = 由允许更新此数据的一个用户拥有,但其他所有用户均可读取。这样,您的数据库就会自动实施访问控制。此机制适用于任何关系数据库。
第一个和第三个选项意味着所有查询和更新都必须包含额外的谓词,以将系统与其他数据隔离开来。这使得查询编写起来更加复杂,并将安全要求推入访问数据的应用程序代码中。
某些数据库(如 Oracle)具有允许您保护表中各个行的功能,这些行通过谓词(=基于列值,如“is_system”标志)进行标识,称为“行级安全性”。如果您使用其中一个数据库,这可能是一个选项。