2015-09-26 2 views
0

Я пытался использовать команду ALTER TABLE с HSQLDB, чтобы добавить 2 столбца в таблицу, но не повезло. Я знаю, что MySQL и другие системы поддерживают его, но почему HSQLDB не поддерживает его? Возможно, я использую неправильный синтаксис, я не знаю. Я также знаю, что я мог бы добавить его один за другим, но мое приложение требует добавления 1000 столбцов, и это слишком медленно, чтобы делать это один за другим.Как добавить несколько столбцов в таблицу с помощью HSQLDB?

Причина, по которой я использую HSQLDB, заключается в том, что мне нужно использовать ее в файловом режиме. Я также пробовал SmallSQL, но он намного медленнее, чем HSQLDB.

+0

Таблица с 1000 столбцами обычно является признаком плохой конструкции базы данных. Можете ли вы объяснить нам, почему вы думаете, что вам нужно столько столбцов? И почему вы не можете просто создать их с помощью команды 'create table'? –

+0

Что касается вопроса: «* но почему HSQLDB не поддерживает его». Ответ на удивление просто: потому что никто еще не реализовал его. Это проект с открытым исходным кодом, поэтому, если вам это действительно нужно, вы можете добавить эту функцию. –

+0

Слышали ли вы о больших данных или широкомасштабных системах в целом? 1000 столбцов не плохой дизайн, такого правила нет. Наши имена столбцов не определены заранее. Данные взяты из наблюдений, и наши пользователи определяют имена столбцов на основе данных, которые собирают данные. Итак, да, у нас есть пользователи, у которых есть тысячи вещей для наблюдения. Они могут наблюдать 100 вещей, затем они могут редактировать наблюдение и добавлять еще 500 вещей. Возможно, мы поедем с MongoDB, он поддерживает даже миллионы «столбцов». – meletis

ответ

0

Для этого вам не нужны тысячи столбцов. Это стандартный один-ко-многим между тремя таблицами: questionaire, question и answer:

create table questionaire 
(
    id    integer not null primary key, 
    customer_name varchar(100) not null 
); 

create table question 
(
    id    integer not null primary key, 
    questionaire_id integer not null references questionaire, 
    question_text  varchar(20000), 
    sort_order  integer 
); 

create table answer 
(
    question_id integer not null references question, 
    answer_text varchar(20000), 
    user_name  varchar(50) not null, 
    primary key (question_id, user_name) 
); 

В действительности вы не на самом деле хранить имя пользователей компьютера находится в answer таблице. Если вы назвали пользователей, которые вошли в систему, вам, вероятно, также понадобится таблица user_account, а таблица question будет ссылаться на таблицу user_account.

Вы можете легко запросить эту модель без необходимости перехода к ключу/магазину значения или JSON

Чтобы получить все questionaires от клиента

select * 
from questionaire qu 
where customer_name = 'Some company'; 

Получить все questionaires и количество вопросов в клиент

select qu.customer_name, 
     count(distinct qu.id) as num_questionaires, 
     count(q.id) as total_questions 
from questionaire qu 
    join question q on qu.id = q.questionaire_id 
group by qu.customer_name; 

Получить все ответы на анкете от конкретного пользователя

select q.question_text, a.answer_text 
from answer a 
    join question q on q.id = a.question_id 
    join questionaire qu on qu.id = q.questionaire_id 
where qu.id = 1 
    and a.user_name = 'Marvin' 
order by q.sort_order; 

немного сложнее, но, вероятно, все еще достаточно быстро, даже с тысячами вопросов и ответов: найти пользователей, которые не ответили на все вопросы

select aq.user_name, aq.questionaire_id, aq.answered_questions, tq.num_questions 
from (
    select a.user_name, q.questionaire_id, count(*) as answered_questions 
    from answer a 
    join question q on q.id = a.question_id 
    group by a.user_name, q.questionaire_id 
) aq join (
    select questionaire_id, count(*) as num_questions 
    from question 
    group by questionaire_id 
) tq on tq.questionaire_id = aq.questionaire_id 
where aq.answered_questions < tq.num_questions; 

SQLFiddle пример: http://sqlfiddle.com/#!15/0a4e5/1


Вы также не должны пытаться перенести строки для каждого вопроса (или ответа) в столбец SQL - вы будет в конечном итоге ударить некоторые ограничения количества столбцов, которые может управлять. Реляционные базы данных были разработаны для обработки строк, много строк, а не «тысяч столбцов». Транспонирование строк в столбцы обычно выполняется на уровне представления вашего приложения (или, например, с использованием функции Pivot в электронной таблице)

+0

Благодарим вас за ответ. Это действительно полезно. Я забыл упомянуть, что каждый «ответ» может быть любого типа, а не только текста. Это может быть число, дата, координата GPS, двоичный файл или множественный выбор. Именно по этой причине мы используем разные столбцы для разных вопросов. Я просто забыл. Именно по этой причине у нас есть тысячи столбцов. Переход на no-SQL позволит решить проблемы масштабируемости. Мы находимся в процессе оценки HBase. – meletis

+0

@melios: вы можете хранить несколько типов ответов в таблице 'answer', имея разные столбцы (с разными типами). Но я с трудом понимаю, почему вы сначала оцените HSQLDB. Для одного HSQLDB, вероятно, не очень хороший выбор, если вы серьезно относитесь к «большим данным». Postgres или любые другие серверные СУБД были бы ** намного лучшим выбором. И во-вторых, вы четко решили, что реляционное решение не будет работать (хотя вам, похоже, не хватает опыта в этой области), почему бы вам не тратить время на поиск реляционной модели? –

+0

Наша платформа уже запущена на кластерном сервере MySQL, на котором размещается несколько сотен приложений, а общий размер данных больше 10T. Платформа представляет собой набор из 8-9 компонентов. Моя первоначальная проблема с HSQLDB была всего лишь крошечным крошечным суб-проектом во всем бизнесе. Один из компонентов нуждается в локальной файловой базе данных, а не в сервере базы данных, и мы оценивали такие базы данных, как SmallSql, SQLite, HSQLDB и H2 Database. Я не хочу доказывать свой опыт ни к чему, я более 18 лет занимаюсь разработкой программного обеспечения, и решения зависят от многих других вещей, кроме моего опыта. – meletis