the*_*ter 8 ruby postgresql activerecord has-many multidimensional-array
我刚刚遇到关于关系和数据库的有趣情况.我正在编写一个ruby应用程序,对于我的数据库,我正在使用postgresql.我有一个父对象"user"和一个相关对象"thingies",用户可以拥有一个或多个东西.使用单独的表与仅在父表中的字段中嵌入数据有什么好处?
ActiveRecord的示例:
使用相关表格:
def change
create_table :users do |i|
i.text :name
end
create_table :thingies do |i|
i.integer :thingie
i.text :discription
end
end
class User < ActiveRecord::Base
has_many :thingies
end
class Thingie < ActiveRecord::Base
belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)
使用嵌入式数据结构(多维数组)方法:
def change
create_table :users do |i|
i.text :name
i.text :thingies, array: true # example contents: [[thingie,discription],[thingie,discription]]
end
end
class User < ActiveRecord::Base
end
Run Code Online (Sandbox Code Playgroud)
相关信息
我使用heroku和heroku-posgres作为我的数据库.我正在使用他们的免费选项,这限制了我10,000行.这似乎让我想要使用多维数组方式,但我真的不知道.
jpg*_*eek 11
在字段中嵌入数据结构可以用于简单的情况,但它会阻止您利用关系数据库.关系数据库旨在查找,更新,删除和保护您的数据.使用包含自己的wad-o-data(数组,JSON,xml等)的嵌入字段,您最终会编写所有代码来自己完成.
有些情况下嵌入字段可能更合适,但对于这个问题,我将使用一个案例突出显示相关表approch的优点.
想象一下博客的用户和帖子示例.
对于嵌入式post解决方案,你会得到一个类似这样的表(psuedocode - 这些可能是无效的ddl):
create table Users {
id int auto_increment,
name varchar(200)
post text[][],
}
Run Code Online (Sandbox Code Playgroud)
使用相关表格,你会做类似的事情
create table Users {
id int auto_increment,
name varchar(200)
}
create table Posts {
id auto_increment,
user_id int,
content text
}
Run Code Online (Sandbox Code Playgroud)
对象关系映射(ORM)工具:使用嵌入式帖子,您将手动编写代码以向用户添加帖子,浏览现有帖子,验证它们,删除它们等.使用单独的表格设计,您可以利用ActiveRecord (或者你正在使用的任何对象关系系统)工具,这应该使你的代码更简单.
灵活性:想象一下,您想要在帖子中添加日期字段.你可以使用嵌入式字段来完成它,但是你必须编写代码来解析你的数组,验证字段,更新现有的嵌入式帖子等.使用单独的表格,这会更简单.此外,假设您要为批准所有帖子的系统添加编辑器.通过关系示例,这很容易.作为查找'Bob'使用ActiveRecord编辑的所有帖子的示例,您只需要:
Editor.where(name: 'Bob').posts
Run Code Online (Sandbox Code Playgroud)
对于嵌入式方面,您必须编写代码来遍历数据库中的每个用户,解析每个帖子并在编辑器字段中查找"Bob".
性能:想象一下,你有10,000个用户,每个用户平均有100个帖子.现在,您要查找在特定日期完成的所有帖子.使用嵌入字段,您必须遍历每个记录,解析所有帖子的整个数组,提取日期并再次检查您想要的日期.这将咀嚼cpu和磁盘i/0.对于数据库,您可以轻松索引日期字段并提取所需的确切记录,而无需解析每个用户的每个帖子.
标准:使用特定于供应商的数据结构意味着将应用程序移动到另一个数据库可能会很麻烦.Postgres似乎有一组丰富的数据类型,但它们与MySQL,Oracle,SQL Server等不同.如果您坚持使用标准数据类型,您将更容易交换后端.
这些是我看到的主要问题.我犯了这个错误并为此付出了代价,所以除非有超级令人信服的理由,否则我会使用单独的表格.