Восхождение на Родительские/Дочерние Отношения Базы данных в Пост-ГРЭС

Если ваша строка подключения настроена как обычный ключ установки приложения, например:

"MyConnection": "Server=localhost;Database=MyDb;User Id=test;Password=test;"

Затем, когда вы передаете IConfiguration .NET Core в ваш ServiceStack AppHost:

app.UseServiceStack(new AppHost
{
    AppSettings = new NetCoreAppSettings(Configuration)
});

[1111 ] Вы сможете получить его как обычную настройку приложения, например:

var myConn = AppSettings.GetString("MyConnection");

Если вместо этого вы настроите его в группе «ConnectionStrings», например:

"ConnectionStrings": {
  "DefaultConnection": "Server=localhost;Database=MyDb;User Id=test;Password=test;"
},

Тогда Вы можете получить к нему доступ из объекта IConfiguration, например:

var config = (NetCoreAppSettings) AppSettings;
var myConn = config.Configuration.GetConnectionString("DefaultConnection");

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

var myConn = AppSettings.GetString("ConnectionStrings:DefaultConnection");

6
задан hooknc 4 February 2009 в 19:10
поделиться

5 ответов

Вы могли записать функцию PL/PgSQL для выполнения рекурсии:

CREATE LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION get_top_parent(
        child integer
) RETURNS integer as $$
DECLARE
        parent integer;
        last_parent integer;
BEGIN
        last_parent := child;
        SELECT INTO parent parentid
        FROM example
        WHERE id = child;

        IF parent is NOT NULL THEN
                parent := get_top_parent(parent);
        ELSE
                parent := last_parent;
        END IF;
        RETURN parent;
END
$$ LANGUAGE plpgsql;

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

1
ответ дан 17 December 2019 в 00:15
поделиться

Изучите книги Joe Celko, SQL для Присяжных острословов и его книги по Деревьям и Иерархиям. У него есть раздел или два в SQL для Присяжных острословов на деревьях и иерархиях, или если Вы хотите действительно войти в него затем, можно получить другую книгу. SQL для Присяжных острословов также затронет большое другое проектирование баз данных и запросы информации. Некоторый действительно хороший материал там. Он представляет альтернативные способы смоделировать деревья, которые могут работать намного лучше, чем модель списка смежности, которую Вы используете.

В одной из его моделей вопрос, "кто самый верхний родитель", становится очень тривиальным.

4
ответ дан 17 December 2019 в 00:15
поделиться

Можно рассмотреть использование "ltree" contrib модуль.

1
ответ дан 17 December 2019 в 00:15
поделиться

С РЕКУРСИВНЫМ от PostgreSQL 8.4 вперед?

1
ответ дан 17 December 2019 в 00:15
поделиться

По моему опыту, SQL не очень хорош в этом виде запроса (рекурсия). Я предложил бы составить дополнительную таблицу с идентификатором и главным родительским идентификатором. Как Вы добавляете больше детей, Вы просто ищете, это - главный родительский идентификатор родителя, и вставьте соответствующую строку в дополнительную таблицу.

Вы могли также сохранить главный родительский идентификатор в своей исходной таблице.

0
ответ дан 17 December 2019 в 00:15
поделиться
Другие вопросы по тегам:

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