Tag: sql

Rails ActiveRecord和DB规范化

将可选的1:1属性分解为各自独立的模型有哪些优缺点。 例如,我刚刚遇到了这样的Rails代码: class Dogs << ActiveRecord::Base # :id (pk), :breed, :weight, :height, :tail_length end class DogSpotsInfo << ActiveRecord::Base # :dog_id (pk), :spot_color, :avg_spot_size, :num_spots end 但这就是我将如何做到这一点(必要时将spot字段保留为null): class Dogs << ActiveRecord::Base # :id, :breed, :weight, :height, :tail_length, :spot_color, :avg_spot_size, :num_spots end 在数据库级别,我认为唯一的区别是涉及可选属性的查询需要另一个连接吗? 前一种方法还有其他缺点吗? 有没有专业人士? 编辑: 我想在一张巨大的狗桌上,据说20%的狗有斑点,也许一个亲,前一种方法是更快的顺序扫描,但我不是100%肯定,如果这是唯一的亲,它似乎是过早的优化。 我能想到的另一个专业是它让模型更小更整洁。 但如果这是目标,也许你可以在不影响数据库结构的情况下通过使用像has_spots :spot这样的东西来做到这has_spots :spot ? 这里的最佳做法是什么?

find_by_sql呈现一个数组

我在这里遇到了一些问题,我无法使我的find_by_sql请求呈现ActiveRecord关系。 实际上,我需要一个activerecord关系来提出新的请求: @searches = @searches.find_by_sql(‘SELECT *, COUNT( follower_id ) FROM follows GROUP BY followable_id LIMIT 0 , 3′) if params[:only_famous_projects] @project_pages = @project_pages.where(:project_id => @searches.pluck(:’followable.id’)) if params[:only_famous_projects] 没有activerecord关系,我不能使用“pluck”。 因此,我认为我必须将我的sql请求转换为Activerecord请求。 但是,只要我在ActiveRecord上使用“count”,我就会遇到一个很大的问题:我最终没有ActiveRecord关系,而是一个FixNum! 我不知道在哪里可以找到答案,如果你能帮助我,我将非常感激。 谢谢

将SQL文件导入Rails 4 ActiveRecord db?

我在这里看了几个其他的问题,它们模糊地相似,但不完全是我正在寻找的。 我要做的是导入/“转换”一个* .sql文件,其中包含8个表,每个表包含大约24列。 这个文件实际上是相当扁平的文件,看起来好像以前唯一有效的查询与关联表之间的共享:id(因此,SELECT * FROM table1,table2 WHERE id =’1’会拉出所有结果,这是当时很好)。 我已经四处寻找,但找不到一个聪明的方法来做到这一点,所以我现在请求Rails专业人员寻求帮助。

Order BY将30ms查询转换为7120ms查询。 已知的性能问题?

我有一个包含1m记录的User表: User (id, fname, lname, deleted_at, guest) 我有以下查询正在对postgres 9.1 db运行: SELECT “users”.* FROM “users” WHERE (users.deleted_at IS NULL) AND (SUBSTRING(lower(fname), 1, 1) = ‘s’) ORDER BY guest = false, fname ASC LIMIT 25 OFFSET 0 使用pgAdmin 3,此SQL需要7120ms才能返回25行。 如果我删除’ORDER BY guest = false,fname ASC’,则查询只需31ms 。 我有以下索引: add_index “users”, [“fname”], :name => “index_users_on_fname” add_index “users”, [“guest”, “fname”], […]

选择* sql query vs选择特定列sql查询

可能重复: 为什么SELECT *被认为有害? 可能是一个数据库nOOb问题。 我们的应用程序有如下表格 表WF Field | Type | Null | Key | Default | Extra | +——————–+————-+——+—–+———+—————-+ | id | int(11) | NO | PRI | NULL | auto_increment | | children | text | YES | | NULL | | | w_id | int(11) | YES | | NULL | | | […]

Rails Postgresfunction索引

我应该如何将包含函数的多语言索引输入schema.rb? 例如,这不起作用: add_index “temporary_events”, [“templateinfoid”, “campaign”, “date(gw_out_time)”, “messagetype”], :name => “temporary_events_campaign_tinfoid_date_messagetype” rake db:test:load 耙子流产了! PGError:错误:列“date(gw_out_time)”不存在 :CREATE INDEX“temporary_events_campaign_tinfoid_date_messagetype”ON“temporary_events”(“templateinfoid”,“campaign”,“date(gw_out_time”,“messagetype”)

处理“超标准化”数据

我的雇主,一家小型办公用品公司,正在转换供应商,我正在查看他们的电子内容,以提出一个强大的数据库架构; 我们以前的模式几乎只是在没有任何想法的情况下被抛在一起,而且它几乎导致了一个具有损坏的,不一致的信息的无法忍受的数据模型。 新供应商的数据比旧供应商的数据要好得多,但他们的数据就是我称之为超标准化的数据 。 例如,他们的产品类别结构有5个级别:主要部门,部门,类,子类,产品块。 此外,产品块内容具有产品的长描述,搜索术语和图像名称(想法是产品块包含产品和所有变体 – 例如特定笔可能有黑色,蓝色或红色墨水;所有这些项目基本上是相同的,所以它们适用于单个产品块)。 在我给出的数据中,这表示为产品表(我说“表”,但它是带有数据的平面文件),其中引用了产品块的唯一ID。 我试图提出一个强大的模式来容纳我提供的数据,因为我需要相对较快地加载它,他们给我的数据似乎与他们的数据类型不匹配在他们的样本网站( http://www.iteminfo.com )上提供演示。 无论如何,我不打算重复使用它们的表示结构,所以这是一个没有实际意义的点,但我正在浏览网站以获得有关如何构建事物的一些想法。 我不确定的是我是否应该以这种格式保存数据,或者例如使用自引用关系将Master / Department / Class / Subclass合并到单个“Categories”表中,并将其链接到a产品块(产品块应该保持独立,因为它不是“类别”本身,而是一组给定类别的相关产品)。 目前,产品块表引用了子类表,因此如果将它们合并在一起,这将更改为“category_id”。 我可能会创建一个电子商务店面,利用Ruby on Rails中的这些数据(或者这是我的计划,无论如何),所以我试图避免以后遇到障碍或者有一个臃肿的应用程序 – 也许我我想的太多了,但我宁愿安全而不是抱歉; 我们之前的数据真是一团糟,由于数据不一致和不准确,使公司损失了数万美元。 此外,我将通过确保我的数据库是健壮的并强制执行约束(我计划在应用程序级别执行它)来稍微脱离Rails约定,所以这也是我需要考虑的事情。 你会如何解决这样的情况? 请记住,我已经将数据加载到模拟表结构的平面文件中(我有文档说明哪些列是哪些列以及设置了哪些引用); 我正在试图决定是否应该像现在这样保持它们的正常化,或者我是否应该寻求巩固; 我需要知道每个方法将如何影响我使用Rails对网站进行编程的方式,因为如果我进行整合,单个表中基本上会有4个“级别”的类别,但这似乎比单独的表更易于管理每个级别,因为除了Subclass(直接链接到产品块)之外,它们除了显示其下的下一级别类别之外什么都不做 。 对于像这样处理数据的“最佳”方式,我总是感到茫然 – 我知道“正常化直到它受到伤害,然后进行反规范化直到它起作用”这一说法,但我直到现在才真正实现它。

Postgres选择一个concat字段并在Rails中ILIKE它

非常简单,试图这样做 SELECT (artist_name || ‘ ‘ || name) as full_name FROM “songs” WHERE “songs”.”working” = ‘t’ AND (full_name ILIKE(‘%Jack Beats%’)) AND (full_name ILIKE(‘%Epidemic%’)) AND (full_name ILIKE(‘%Dillon Francis%’)) ORDER BY songs.published_at asc LIMIT 1 但我明白了 ActiveRecord::StatementInvalid: PG::Error: ERROR: column “full_name” does not exist 我已经尝试在工作站之前添加表名,但没有效果。

优化困难查询(可能带有吱吱声)

有这样的代码(使用PublicActivity gem&Squeel) def index @activities = Activity.limit(20).order { created_at.desc } @one = @activities.where{trackable_type == ‘Post’}.includes(trackable: [:author, :project]) @two = @activities.where{trackable_type == ‘Project’}.includes trackable: [:owner] @activities = @one + @two end 但它创建了8个 SQL请求: SELECT “activities”.* FROM “activities” WHERE “activities”.”trackable_type” = ‘Post’ ORDER BY “activities”.”created_at” DESC LIMIT 20 SELECT “posts”.* FROM “posts” WHERE “posts”.”id” IN (800, 799, […]

postgresql,奇怪的OFFSET / LIMIT行为(记录顺序)

所以基本上我有这个范围(sql): scope.to_sql => “SELECT \”offers\”.* FROM \”offers\” INNER JOIN \”cities_offers\” ON \”offers\”.\”id\” = \”cities_offers\”.\”offer_id\” WHERE \”cities_offers\”.\”city_id\” = 2 AND \”offers\”.\”category_id\” IN (2) AND (offers.category_id is NOT NULL) ORDER BY offers.discount desc LIMIT 25 OFFSET 0″ 不知何故,上述查询的记录顺序不同,而且没有LIMIT和OFFSET的记录顺序不同: scope[6] => # #<Offer id: 8729 … 8629和8729记录都具有相同的discount值(我订购的属性)。 如果可以在这些情况下保持相同的记录顺序,请您提供建议吗?