Как сохранить список в столбце дб

A StackOverflowError - ошибка времени выполнения в java.

Он вызывается, когда количество памяти стека вызовов распределено JVM.

Обычный случай, когда a StackOverflowError выбрасывается, когда стек вызовов превышает из-за чрезмерной глубокой или бесконечной рекурсии.

Пример:

public class Factorial {
    public static int factorial(int n){
        if(n == 1){
            return 1;
        }
        else{
            return n * factorial(n-1);
        }
    }

    public static void main(String[] args){
        System.out.println("Main method started");
        int result = Factorial.factorial(-1);
        System.out.println("Factorial ==>"+result);
        System.out.println("Main method ended");
    }
}

Трассировка стека:

Main method started
Exception in thread "main" java.lang.StackOverflowError
at com.program.stackoverflow.Factorial.factorial(Factorial.java:9)
at com.program.stackoverflow.Factorial.factorial(Factorial.java:9)
at com.program.stackoverflow.Factorial.factorial(Factorial.java:9)

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

50
задан Nifle 14 January 2009 в 19:04
поделиться

6 ответов

В нормализованной реляционной базе данных такая ситуация недопустима. У Вас должна быть объединяющая таблица, которая хранит одну строку для каждого отличного идентификатора объекта НЕЧТО и идентификатора Фруктов. Существование такой строки означает, что фрукт находится в том списке для НЕЧТО.

CREATE TABLE FOO ( 
  id int primary key not null,
  int1 int, 
  int2 int, 
  int3 int
)

CREATE TABLE Fruits (
  id int primary key not null,
  name varchar(30)
)

CREATE TABLE FOOFruits (
  FruitID int references Fruits (ID),
  FooID int references FOO(id),
  constraint pk_FooFruits primary key (FruitID, FooID)
)

Для добавления фруктов Apple к списку определенного НЕЧТО возражают с ID=5, Вы были бы:

INSERT FOOFruits(FooID, FruitID)
SELECT 5, ID FROM Fruits WHERE name = 'Apple'
87
ответ дан Mehrdad Afshari 7 November 2019 в 20:54
поделиться

Если Вы совершенно уверены в том, что Вы делаете (т.е. Вы не должны будете искать значения списка, например), Вы могли также сериализировать свой объект, или просто объект списка, и сохранить его в столбце двоичных данных.

Просто разделение символа значения могут быть прекрасными также и более дешевые с точки зрения сохранения и загрузки, но быть осторожными, Ваши данные не содержат символ разделителя, или выходят из него (и обрабатывают Escape соответственно при загрузке и т.д... Ваш предпочтительный язык может сделать лучшее задание в этом, чем Вы, все же.;))

Однако для "надлежащего" решения, сделайте то, что Mehrdad описал выше.

4
ответ дан AKX 7 November 2019 в 20:54
поделиться

Его технически возможный, но был бы очень плохой дизайн, imo.

Вы могли сделать это путем создания строки и хранения его в nvarchar (макс.) поле (при использовании SQL-сервера или его эквивалента).

3
ответ дан E.J. Brennan 7 November 2019 в 20:54
поделиться

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

Составляют таблицу с двумя столбцами, тот, который содержит указатели на первичный ключ таблицы объектов и тот, который содержит указатели на первичный ключ фруктовой таблицы. Затем если объект имеет три фруктов, существует три строки в object_fruit таблице что вся вся точка к тому же объекту, но к трем различным фруктам.

0
ответ дан Andru Luvisi 7 November 2019 в 20:54
поделиться

Вы можете, но это будет, вероятно, рассматривал как текст, делая ищущий в этом столбце трудный и медленный. Вы лучше из использования связанной таблицы.

1
ответ дан Diodeus - James MacFarlane 7 November 2019 в 20:54
поделиться
INSERT FOOFruits (FooID, FruitID)
SELECT 5, ID 
FROM   Fruits 
WHERE  name IN ('Apple', 'Orange');
-1
ответ дан Leigh 7 November 2019 в 20:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: