rdbms数据库mysql_mysql-关系数据库(RDBMS)非规范化数据

我相信这个问题并没有专门针对MySQL-我正在使用的数据库-,而是关于最佳实践的问题.

到目前为止,我的问题可以通过创建表和查询表(有时在这里和那里联接)来解决.但是我正在做的事情感觉不对劲,每当我需要在我的“常见”查询旁边加上非规范化数据时,就会触发我.

示例用例

为了让我更好地表达自己,让我们创建一个肤浅的场景,其中:

>用户可以购买产品并产生购买(让我们忽略购买只能有一个产品这一事实);

>并且我们需要查询产品的购买总次数;

为了解决用例,我们可以定义一个简单的结构,该结构由:

>产品表:

> product_id [INT PK]

>用户表:

> user_id [INT PK]

>购买表:

> Purchase_id [INT PK]

> product_id [INT FK NOT NULL]

> user_id [INT FK不为空]

这是不对劲的地方:当我们需要检索具有购买总次数的产品列表时,我将创建查询:

# There are probably faster queries than this to reach the same output

SELECT

product.product_id,

(SELECT COUNT(*) FROM purchase

WHERE purchase.product_id = product.product_id)

FROM

product

我担心的原因是,我已经阅读到COUNT会进行全表扫描,并且当我缩放到要购买的数千种产品时,即使在购买时我已经用product_id FK创建了一个INDEX( MySQL默认执行此操作.

可能的解决方案

我对关系数据库的了解还很浅,因此在比较这些问题的替代方案(合理的替代方案)时,我有点迷失了.不用说我还没有做完作业(在询问之前先搜索),我发现可以这样做:

创建交易:

插入新购买商品时,它必须始终位于事务中,该事务还将使用purchase.product_id更新产品表.

可能的问题:人为错误.有人可能不进行交易和BAM而手动插入了购买商品-我们存在不一致之处.

创建触发器:

每当我插入,删除或更新某些特定表中的某些行时,我都会使用新值(bought_amount)更新我的产品表.因此表将变为:

>产品表:

> product_id [INT PK]

> buy_amount [INT NOT NULL];

可能的问题:触发器昂贵吗?有没有一种方法可以成功插入但触发器不会成功-从而使我前后不一致?

更新某些表以存储不断变化的数据是RDBMS的一种可行方法吗?长期加入并计数/求和其他事件是否更安全,并且从长远来看更有利?

我发现了一些有关此问题的有用问题/答案,但没有一个能广泛地解决这个问题.

请考虑我对RDBMS的无知,因为我可能会建议废话.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值