Как реализовать высокопроизводительный структурный вид в SQL Server 2005

Я думаю, что вам нужен метод безопасного чтения для свойства в object. Вы можете создать метод, который получает object и key и безопасно читает это свойство, связывающее проверки. Примеры цепочек, которые вы можете использовать, чтобы подойти к этому:

obj && obj.key ? obj.key : "N/A"

или

(obj || {}).key || "N/A"

или

obj && obj.key || "N/A"

И в будущем (надеюсь, не так долго ) может быть, вы можете использовать следующий:

obj?.key || "N/A"

Ссылка

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

[1117 ]

let obj1 = null;
let obj2 = {};
let obj3 = {name: ""}
let obj4 = {name: "John"}

const safeReadObj = (obj, key) => obj && obj[key] || "N/A";

// Test cases:
console.log(safeReadObj(obj1, "name"));
console.log(safeReadObj(obj2, "name"));
console.log(safeReadObj(obj3, "name"));
console.log(safeReadObj(obj4, "name"));

5
задан John Saunders 6 April 2010 в 19:59
поделиться

4 ответа

Use CTE's.

Given the tree-like table structure:

id parent name
1  0      Electronics
2  1      TV
3  1      Hi-Fi
4  2      LCD
5  2      Plasma
6  3      Amplifiers
7  3      Speakers

, this query will return id, parent and depth level, ordered as a tree:

WITH    v (id, parent, level) AS
        (
        SELECT  id, parent, 1
        FROM    table
        WHERE   parent = 0
        UNION ALL
        SELECT  id, parent, v.level + 1
        FROM    v
        JOIN    table t
        ON      t.parent = v.id
        )
SELECT  *
FROM    v

id parent name
1  0      Electronics
2  1        TV
4  2          LCD
5  2          Plasma
3  1        Hi-Fi
6  3          Amplifiers
7  3          Speakers

Replace parent = 0 with parent = @parent to get only a branch of a tree.

Provided there's an index on table (parent), this query will efficiently work on a very large table, since it will recursively use INDEX LOOKUP to find all chilrden for each parent.

To update a certain branch, issue:

WITH    v (id, parent, level) AS
        (
        SELECT  id, parent, 1
        FROM    table
        WHERE   parent = 0
        UNION ALL
        SELECT  id, parent, v.level + 1
        FROM    v
        JOIN    table t
        ON      t.parent = v.id
        )
UPDATE  table t
SET     column = newvalue
WHERE   t.id IN
        (
        SELECT  id
        FROM    v
        )

where @parent is the root of the branch.

8
ответ дан 18 December 2019 в 13:19
поделиться

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

2
ответ дан 18 December 2019 в 13:19
поделиться

Сначала вы должны задать себе следующие вопросы: 1) Каково соотношение модификаций и прочтений? (= в основном статичное дерево или постоянно меняется?) 2) Насколько глубоко и насколько велико, по вашему мнению, вырастет дерево?

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

Материализованный путь хорошо работает для динамических (изменяющихся) деревьев с ограниченной / предсказуемой глубиной.

Рекурсивные CTE идеальны для очень маленьких деревьев, но операции ветвления («получить всех дочерних элементов в этой ветви» .. ") получить очень дорого с глубоким / большим деревом.

3
ответ дан 18 December 2019 в 13:19
поделиться

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

http://www.sqlteam.com/article/more-trees-hierarchies-in-sql

1
ответ дан 18 December 2019 в 13:19
поделиться
Другие вопросы по тегам:

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