3

パス列挙列からパンくずを作成したいと思います。

これが私が持っているデータセットの例です。

https://spreadsheets.google.com/ccc?key=0AsGYQbeSAIgFdGRscFpsZFJpQUtfWGIwYWNUY2ktRHc&hl=en_GB&authkey=CPOuuogF

id woeid parent_woeid country_code name language place_type ancestry

1/23424975/24554868/12602167/12696151ancestry は、イギリスのブライトンのパスなど、列挙されたパスです。

name列にクエリを実行してブレッドクラムを取得し、すべての親を取得できるようにしたいと考えています。

すなわち。世界、ヨーロッパ、イングランド、[郡]、[町]、[地域]、[場所]

([] = a placeholder)

データは決して変更されないため、このテーブルでは隣接リストとパスの列挙が使用されます。

4

1 に答える 1

5

いくつかの可能なアプローチ。あなたがやりたいことから、私があなたに提案することへと進みます。

マテリアライズド パス

残念ながら、列挙されたパスの祖先 (親子関係など)はコストが高く、SQL のみで行うには扱いにくい(マテリアライズド パスの検索に関するセクションを参照"An employee FORD and chain of his supervisors")。事前にパスがあり、ある種のプログラミング言語を使用できる場合、最も簡単な方法はIN句を使用することです。

SELECT *
FROM woe
WHERE ancestry IN (
    '1', 
    '1/23424975', 
    '1/23424975/24554868', 
    '1/23424975/24554868/12602167', 
    '1/23424975/24554868/12602167/12696151'
)
ORDER BY LEN(ancestry)

隣接リスト

または、データの隣接リストの側面を利用して、共通テーブル式を使用するか、CONNECT BY代わりにデータベースに依存することができます (これはancestry列を無視します)。隣接リストを使用して祖先を照会する方法については、RDBMS で階層データを表現するさまざまな方法に関する私の質問を参照してください (質問の最後にあるデータベース固有の注意事項のセクションを参照してください)。

ネストされたセット

データは変更されず、祖先を照会したいと書いています。ネストされたセット表現は、SQL のみを使用して必要な情報を取得するのが簡単で、どのデータベースでも機能し、非常に安価な操作であるため、この状況では完璧なアプローチです。欠点は、移動と挿入に費用がかかることです。MySQL での階層データの管理は、それがどのように機能するかについて私が提供できる最良の説明です。

入れ子になったセットは、あなたのデータ、あなたがしたいこと、そしてそれが変わらないことを考えると、私が使用するものです。

于 2011-01-15T21:03:47.893 に答える