2016-07-21 238 views
0

我准备第一次构建一个大型多表支持的站点,并希望Ruby社区能够帮助我指出如何去构建这个方向的正确方向。多表搜索过滤器

关于该应用程序:我有几个大型表(每个表>> 200k +行和30列)。每个表格之间的列不匹配,如果尝试扩展到更宽,并合并到一个表格中,则我的总列将会无法控制。所以创建一个主表不是我脑海中的可能性。所有表格的行(观察)都通过unique_id连接。我想要做什么以及我希望从这个社区得到一些建议的地方是我如何创建一个可以从各种表中获得的多重搜索标准。

这是一个缩小的例子,我期待完成。在这个例子中,我们有table_1和table_2(两个表格样本如下)。而假设为名称的用户搜索:和主题:英语,为了看Tim的英语等级:78

我已经没有一个表的工作问题,但从来没有与多个合作通过一个公共标识符连接的表。再次请记住,这是一个缩小版本。我的实际表格都非常大,如果没有我的列太大,我无法创建一个表格。

我该如何去确保过滤器能够:A:保持他们选择的变量,而B:用户搜索其他表?我希望我在这里明确自己。提前感谢您提供任何指示或建议,以指引我朝着正确的方向发展。

TABLE_1   

Unique_ID Name Age  Sex 
    1  Tim  16  Male 
    2  Chris 15  Male 
    3  Brad 18  Male 
    4  Mary 20  Female 


TABLE_2 

Unique_ID Subject  Grade 
    1  Math   88 
    1  English  78 
    1  History  98 
    2  Math   65 
    2  English  72 
    2  History  84 
+0

您谈论数据库,但您的示例看起来像数据库中的多个表。你的意思是数据库还是表格?您认为问题的可能性有多大? – knut

+0

是的,表格,你是对的。我编辑了这个问题来反映这个变化。 – richiepop2

+0

从你的问题,我认为你是Ruby on Rails的新手?或者您是否已经为此应用程序编写了模型和迁移?如果你这样做,你能发布一个与你的问题相关的模型吗?还是你在写这样的模型和相关范围寻求帮助? – rdnewman

回答

0

您可以定义一个视图来创建一个大表。

示例代码(我用的续集和SQLite在我的例子,但AR将提供类似的功能。):

#Prepare example 
require 'sequel' 
DB = Sequel.sqlite() 
Sequel.extension :pretty_table 

DB.create_table(:tab1){ 
    Fixnum :Unique_ID 
    String :Name  
    Fixnum :Age  
    String :Sex 
} 
DB[:tab1].insert(1, 'Tim', 16, 'Male') 
DB[:tab1].insert(2, 'Chris', 15, 'Male') 
DB[:tab1].insert(3, 'Brad', 18, 'Male') 
DB[:tab1].insert(4, 'Mary', 20, 'Female') 

DB.create_table(:tab2){ 
    Fixnum :Unique_ID 
    String :Subject 
    Fixnum :Grade 
} 

DB[:tab2].insert(1, 'Math', 88) 
DB[:tab2].insert(1, 'English', 78) 
DB[:tab2].insert(1, 'History', 98) 
DB[:tab2].insert(2, 'Math', 65) 
DB[:tab2].insert(2, 'English', 72) 
DB[:tab2].insert(2, 'History', 84) 


#Show how you could use a view to select on two tables 
Sequel::PrettyTable.print(
    DB[:tab1].inner_join(:tab2, :Unique_ID => :Unique_ID).filter(:Name => 'Tim', :Subject => 'Math') 
) 

结果:

+---+-----+----+----+-------+---------+ 
|Age|Grade|Name|Sex |Subject|Unique_ID| 
+---+-----+----+----+-------+---------+ 
| 16| 88|Tim |Male|Math |  1| 
+---+-----+----+----+-------+---------+ 

的一个问题是表的大数目。所以我不建议用所有数据创建一个大视图,也不要创建很多视图。 您可以使用您选择所需的数据来定义连接。