在某些情况下,将冗余数据存储在数据库中以提高速度是有意义的吗?

ben*_*ben 3 database relational-database

在以下情况下:

user has many bags
bag has many items

users
-id

bags
-id
-user_id

items
-id
-bag_id
Run Code Online (Sandbox Code Playgroud)

有两种方法可以访问用户的项目。

1) 可以给用户添加一个实例方法,该方法会迭代用户的每个包,并将包中的物品收集到一个数组中返回。在 Ruby on Rails 中,类似于:

#in user.rb
def items
    items = []
    bags.includes(:items).each { |bag| items += bag.items }
end
Run Code Online (Sandbox Code Playgroud)

2)user_id直接在items表中添加一个属性,并添加一个附加关系,这样user has many items。那么就做吧user.items

第二种方法会更快,但涉及存储冗余数据。在某些情况下实施它是否有意义?

The*_*ral 7

是的,在某些情况下,为了性能而引入一些受控冗余确实有意义。通常,仅当数据库无法满足其性能要求时才应执行此操作。这称为“非规范化”,您必须考虑的是:

\n\n
    \n
  • 可能会使实施变得更加复杂
  • \n
  • 经常牺牲灵活性\xe2\x80\xaf
  • \n
  • 可能会加快检索速度,但会减慢更新速度(因为您现在必须更新多个位置)
  • \n
\n\n

因此,在性能不理想且关系更新率低、查询率高的情况下,需要考虑这一点。

\n\n

还有一些非规范化的数据库设计,例如数据库仓库中使用的星型模式。

\n