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。
第二种方法会更快,但涉及存储冗余数据。在某些情况下实施它是否有意义?
是的,在某些情况下,为了性能而引入一些受控冗余确实有意义。通常,仅当数据库无法满足其性能要求时才应执行此操作。这称为“非规范化”,您必须考虑的是:
\n\n因此,在性能不理想且关系更新率低、查询率高的情况下,需要考虑这一点。
\n\n还有一些非规范化的数据库设计,例如数据库仓库中使用的星型模式。
\n