将两个整数存储为小数有什么缺点?
我将资产详细信息存储在表中,每种资产类型都有自己的表(每种资产都非常不同)并使用另一个表来定义资产表,因此每个资产表都有一个整数 ID,每个资产也有一个整数 ID。
我有两种不同的场景,这可能很方便:
有一个“审计”表存储信息,如:这个用户对那个项目做了这个
有人被指派处理这种类型的资产。我正在考虑像 assetType.assetID 这样存储它,所以资产类型 5 和 id 99 将是十进制的 5.99
我很少需要根据 5.99 进行选择,我只是查询存储 5.99 的记录,然后拆分它并使用函数转到表 5 记录 99。
我无法将 assetID 绑定到特定表;assetType 是引用资产表的表中条目的 ID(定义表名、主键列等),所以看起来我已经无法以任何一种方式使用外键约束。
有很多资产表,比如asset_tmv
和asset_backflow
。资产根据其所在的表分配类型,因为为每个资产存储的数据差异很大。
我意识到我可以使用 2 个整数字段来实现这一点。我想知道的是:缺点是什么?
注意:为了揭示通过其专用(逻辑级别)列处理每个离散数据点的优势,此答案完全基于以下摘录:
为了全面分析场景(每个实体类型、属性和相关关联),对您正在处理的特定业务领域的所有信息需求的描述是必不可少的;换句话说,必须知道适用的业务规则,在编辑时尚未提供。
如果您想提供所有需要的信息,以及涉及的所有相关细节,请告诉我,我很乐意分享我对整个场景的看法。
您通过评论澄清了您的意图是构建关系数据库,因此在同一列中保留两条不同的信息将意味着多个缺点,例如:
正在考虑的数据库的逻辑抽象级别不会以所需的精度表示相应的概念模式。
逻辑级约束(值验证)将更难(或不可能)以声明方式设置(必须求助于陈旧的、次优的、过程性的方法来保护数据完整性)。
逻辑级别的数据操作变得不必要地麻烦。
为了优化甚至支持逻辑操作,数据库管理系统必须在物理层面执行的工作变得过于复杂。
通常,数据库的使用变得不必要地更加困难,因为数据库结构和约束会让 DBA、应用程序程序员,更重要的是,最终用户感到困惑(在某些环境中,有些高级用户在没有应用程序帮助的情况下访问数据库)。
资产示例_
我们以资产实体类型的场景为例。因此,从概念层面开始分析,可以说:
因此,该特定业务领域的信息需求需要跟踪两个不同的数据点,即Asset.Id和Asset.Type,每个数据点都具有确切的含义;因此,在这个阶段,很明显他们每个人:
随后,可以通过以下逻辑级 SQL-DDL 布局来表示所述概念元素:
正如演示的那样,每个数据都将保存在其专用列中,并且采用这种安排:
可以声明性地约束
asset.asset_id
为asset
表的 PRIMARY KEY,这样可以防止在此类列中接受重复值的可能性。多年来,数据库管理系统程序员一直致力于优化“幕后”执行的相关物理级流程。被声明为 PRIMARY KEY,该
asset.asset_id
列现在可以从一个或多个 FOREIGN KEY 约束中“用作目标”,以防万一。通过在列上声明 FOREIGN KEY 约束
asset.asset_type_id
,引用asset_type.asset_type_id
.您不必在数据操作操作中求助于访问列值子部分的函数(如在非原子组合列的情况下),无论是 INSERT、SELECT、UPDATE、DELETE 或其组合。函数会 (1) 增加物理级别的处理时间,并且 (2) 会降低代码的可读性。
(a) 逻辑布局精确地反映了 (b) 概念模式,这有助于所有相关方解释数据结构和结果集。自己编写查询要简单得多,因为每一列代表一条清晰且独立的信息。
在物理层面,拥有一个单独的
asset.asset_type_id
列允许为该表固定一个(或多个)单列或多列索引,这可以加速逻辑查询的执行,例如,将列作为条件包含在WHERE 子句。因此,鉴于以上所有内容,我的主要观点是:每个感兴趣的数据点都应在逻辑级别上由其对应的(正确键入和适当约束的)单个列表示。
我建议你自己重新彻底分析场景,从(i)概念层面开始,然后进行(ii)相应的逻辑设计,因为这种方法有助于获得精确的映射,你将能够避免不必要的直接破解。
审计追踪
您在问题中提到您有兴趣为有问题的数据库启用某种审计跟踪,因此,鉴于此,我建议采用类似于我在这个答案和另一个答案中公开的方法(都是关于时间能力)与相关的适应,当然。
但是用户没有在工作
assetID=99
,用户在工作assetID=990
。我相信 MySQL 会匹配5.99
两者。您应该将两个不同的值存储在两个不同的列中。
社区 wiki 答案请编辑以改进
从索引和执行的角度来看,您正在引入无法使用索引查找功能的执行计划的可能性。这意味着更新和选择的性能不佳。似乎有很多额外的工作没有回报。