多表搜索过滤器

时间:2016-07-21 17:28:14

标签: ruby-on-rails ruby database postgresql

我准备第一次建立一个大型的多桌支持网站,并希望红宝石社区可以帮助我指出如何构建这个网站的正确方向。

关于应用:我有几个大表(每个表有> 200k +行和30列)。每个表之间的列不匹配,如果尝试将长扩展为宽,并合并到一个表中,我的总列将无法控制。因此,在我看来创建一个主表是不可能的。所有表格的行(观察)都通过unique_id连接。我想要做什么,以及我希望从这个社区得到一些建议,我是如何创建一个可以从各种表中提取的多重搜索条件。

这是我想要完成的缩小示例。在这个例子中,我们有table_1和table_2(两个表样本都在下面)。并且让我们说用户搜索姓名: Tim 和主题:英语,以便查看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

1 个答案:

答案 0 :(得分:0)

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

示例代码(我在我的示例中使用了Sequel和SQLITE。但AR将提供类似的功能):

if (found != string::npos && binarySearch(wrongLetters, used, guessLetter) == -1)
    {
        wrongLetters[turnNumber] = toupper(guessLetter);
        for (int i = 0; i < guessWord.length(); i++)
        {
            if (guessWord[i] == guessLetter)
                maskedWord[i] = guessLetter;
        }
    }
    else if (found != string::npos && binarySearch(wrongLetters, used, toupper(guessLetter)) != -1)
        cout << "That letter has already been used\n\n";
    else if (found == string::npos && binarySearch(wrongLetters, used, toupper(guessLetter)) != -1)
        cout << "That letter has already been used\n\n";
    else if (found == string::npos && binarySearch(wrongLetters, used, guessLetter) == -1)
    {
        wrongLetters[turnNumber] = toupper(guessLetter);
        cout << guessLetter << " is NOT in the word to guess\n\n";
        incorrectCount++;
    }

结果:

#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')
)

一个问题是大量的表格。因此,我不建议使用所有数据创建一个大视图,也不建议创建许多视图。 您可以使用选择所需的数据定义连接。