对PostgreSQL DB使用一个查询或多个查询

时间:2015-12-06 15:46:34

标签: postgresql tornado postgresql-9.3 momoko

我有以下数据库

CREATE TABLE IF NOT EXISTS users (
    user_uid INTEGER PRIMARY KEY, 
    user_name CHAR(64) NOT NULL,
    token_id INTEGER
);

CREATE TABLE IF NOT EXISTS unique_thing (
    id SERIAL PRIMARY KEY,
    unique_thing_id INTEGER NOT NULL, 
    option_id INTEGER NOT NULL
);

CREATE TABLE IF NOT EXISTS example (
    id SERIAL PRIMARY KEY, 
    variable INTEGER NOT NULL,
    variable_2 INTEGER NOT NULL,
    char_var CHAR(64) NOT NULL, 
    char_var2 CHAR(512),
    char_var3 CHAR(256), 
    file_path CHAR(256) NOT NULL
);



CREATE TABLE IF NOT EXISTS different_option_of_things (
    id SERIAL PRIMARY KEY,
    name CHAR(64)
);

CREATE TABLE IF NOT EXISTS commits (
    id SERIAL PRIMARY KEY, 
    user_id INTEGER NOT NULL, 
    unique_thing_id INTEGER NOT NULL, 
    value REAL NOT NULL, 
    var CHAR(512) NOT NULL, 
    example_id INTEGER NOT NULL,
    boolean_var boolean NOT NULL
);

unique_thingdifferent_option_of_thingsexamples将是静态的(数据将很少添加并手动添加)。 表commits将相当大。它将仅用于插入表(我很少删除)。 用户将是具有用户身份的表。它不会像unique_thing那么大,但会有相当多的用户。

表的数据如下:

INSERT INTO users VALUES(1, 'pacefist', 2);
INSERT INTO users VALUES(3, 'motherfucker', 4);
INSERT INTO users VALUES(4, 'cheater', 5);

INSERT INTO different_option_of_things   VALUES(1, 'blablab');
INSERT INTO different_option_of_things   VALUES(2, 'smth different');
INSERT INTO different_option_of_things   VALUES(3, 'unique_thing');
INSERT INTO different_option_of_things   VALUES(4 ,'unique_thing2');

INSERT INTO unique_thing  VALUES(DEFAULT, 1, 1);
INSERT INTO unique_thing  VALUES(DEFAULT, 1, 3);
INSERT INTO unique_thing  VALUES(DEFAULT, 2, 3);
INSERT INTO unique_thing  VALUES(DEFAULT, 2, 2);

INSERT INTO example VALUES(1, 20, 20, 'fsdfsdf', 'fgdfgdfg', 'url', '/home/user/file.txt');
INSERT INTO example VALUES(2, 24, 40, 'sfadfadf', 'dfgdfg', 'url', '/home/user/file2.txt');

INSERT INTO commits VALUES(DEFAULT, 1, 1, 55.43, '1234567', 1, TRUE);
INSERT INTO commits VALUES(DEFAULT, 2, 1, 97.85, '1234573', 2, TRUE);
INSERT INTO commits VALUES(DEFAULT, 3, 1, 0.001, '98766543', 1, TRUE);
INSERT INTO commits VALUES(DEFAULT, 4, 2, 100500.00, 'xxxxxxxx', 1, TRUE);

因此,数据将按以下方式插入:

1) I have input data of different_option_of_things, e.g.,  [ blablab, unique_thing],  the REAL value (like 8.9999) and the number of example like `fsdfsdf`
2) It's necessary to find this record in the table `unique_thing`
a) if we've found 2 or more values or haven't found anything 
    results false -> the search is over
b) if we've found 1 result then 
    3) we are searching all values (record from unique_thing) in the 'commits' table. 
     a) if it has been found 
        a.1 search of the given example name
          a.1.1 if found -> get first 25 values and check whether the current value is bigger
               a.1.1.1 if yes, we make a commit
               a.1.1.2 if no, do nothing (do not duplicate the value)
          a.1.2 no -> no results
        a.2 if no -> no results

第二个函数几乎相同,但是没有插入,我们只是选择而不插入(仅用于获取数据),并且会找到表'examples'中的所有现有值(不仅仅是一个)。

问题:创建3个函数而不是一个大查询是否更好?

SELECT count(1) AS counter FROM different_option_of_things 
        WHERE name IN (SELECT * FROM unnest(different_option_of_things));

SELECT * FROM example where id=fsdfsdf;

SELECT TOP 25
    FROM commits
    JOIN unique_thing
    ON commits.id=unique_thing.unique_thing_id where value > 8.9999;

if results-> 0 do a commit

或者写一个巨大的查询是否更好?我正在使用Postgresql,Tornado和momoko。

1 个答案:

答案 0 :(得分:0)

我更喜欢两个存储过程来获取和插入数据。

优点:

  • 所有必需的数据都在db中,因此它似乎是db的工作,
  • 每次执行调用都需要:

    1. 获取/等待池中的可用连接(取决于您的应用)
    2. 运行查询
    3. 获取数据
    4. 发布连接

      X。在IOLoop上的所有操作之间

    5. 虽然momoko没有阻止,但不是免费

    6. db可以是api,不仅仅是大量的数据

缺点:

  • db中的逻辑意味着你依赖它 - 更改数据库引擎(例如cassandra)会更难
  • 通常在db中的逻辑意味着没有测试。当然你可以,你应该测试它(例如pgTap
  • 对于简单的任务来说,这似乎是一种矫枉过正的行为

这是数据库和应用程序负载,性能和时间限制的问题 - 换句话说,运行测试并选择满足您的期望/要求的解决方案。