Матрица смежности от Java до SQL

У меня есть матрица смежности типа данных String в Java:

String[][] A;

Я хочу прочитать свою матрицу смежности A в таблицу MySQL. Проблема в том, что я никогда не знаю, сколько строк/столбцов мне понадобится (и я бы не хотел создавать все столбцы). Я думаю, что хитрость в решении этой проблемы заключается в создании столбцов на лету. Как добавить столбцы «на лету»?

Как только я смогу добавлять столбцы на лету, я смогу читать матрицу построчно.

  1. Я хочу иметь возможность просматривать данные в виде матрицы.

Вся помощь очень ценится!


person CodeKingPlusPlus    schedule 27.12.2012    source источник


Ответы (2)


Вместо того, чтобы мучиться с настройкой переменных столбцов, создайте простую таблицу базы данных A:

row     integer
col     integer
content varchar

Это дает вам возможность легко избегать пустых записей, и у вас есть одна строка таблицы базы данных для каждого элемента массива.

У вас есть два варианта:

  1. Создайте одну строку базы данных для каждого элемента вашего массива, включая нули, или
  2. Создайте одну строку базы данных для каждого элемента, который не равен нулю.

Для варианта 1 этот код предоставит любой элемент:

private String getElement(int row, int col) {
    String result = null;
    try {
        if(rs.absolute(row*colNumber+col+1))
            result=rs.getString("content");
    } catch (SQLException ex) {
        System.out.println(ex.getMessage());
    }
    return result;
}

Для варианта 2 содержимое запрошенного элемента в row,col находится следующим образом:

private String getElement(int row, int col) {
    String result = null;
    String query = "SELECT * from A where row=? and col=?";
    try {
        PreparedStatement preps = con.prepareStatement(query);
        preps.setInt(1, row);
        preps.setInt(2, col);
        preps.execute();
        rs = preps.getResultSet();
        if (rs.next()) {
            result = rs.getString("content");
        }
    } catch (SQLException ex) {
        System.out.println(ex.getMessage());
    }

    return result;
}

Очевидно, что вариант 1 обеспечивает более быстрый доступ к элементам. Вариант 2 экономит место в базе данных.

PS: Если у вас есть массив массивов разной длины, вариант 1 не будет работать.
colNumber – это фиксированное количество столбцов вашего массива String.

person Costis Aivalis    schedule 27.12.2012
comment
Это явно правильное решение. По возможности всегда следует избегать динамического изменения схемы таблицы. - person Joe K; 28.12.2012
comment
Я вижу, как это намного эффективнее, есть ли способ запросить данные в этом формате, чтобы я мог физически смотреть на свои данные как на матрицу? Я действительно хочу иметь возможность физически просматривать данные в виде матрицы n на n. - person CodeKingPlusPlus; 28.12.2012
comment
В случае, если вы получите массив известных номеров строк и столбцов, если вы добавите все элементы в базу данных, даже пустые элементы rs.absolute(row*columnNumber+column+1) будут позиционировать ваш курсор в правую строку. Если у вас нет фиксированного количества столбцов или вы не хотите иметь строку базы данных для пустых элементов, то напишите метод String getElement(int row, int col) и выберите нужную запись . Он должен возвращать значение null, если элемент пуст, или строку, если нет... - person Costis Aivalis; 28.12.2012
comment
Не могли бы вы рассказать немного подробнее о вашем решении? Я не знаю, что вы подразумеваете под курсором и заголовками методов, которые вы написали, и как это применимо к этой проблеме. - person CodeKingPlusPlus; 28.12.2012

Может быть, вы можете добавить столбцы в таблицу. Представьте, что ваша таблица называется «MYTABLE». В SQL Server вы можете написать:

ALTER TABLE MYTABLE ADD COLUMN COLX varchar(255);

где X — количество столбцов, которые вам понадобятся.

Эта опция позволит вам добавить столбцы в вашу таблицу, но, возможно, решение состоит в том, чтобы создать новую таблицу, выпадающую из предыдущей:

DROP TABLE MYTABLE;
CREATE TABLE MYTABLE(COL1 varchar(255), COL2 varchar(255)...);

Дайте мне знать, если это была ваша проблема. Спасибо.

person tpgalan    schedule 27.12.2012