メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
このガイドには VillageSQL 0.0.4 以降が必要です。
MySQL には、n 次元空間の点や領域を表現する組み込みの方法がありません。複数の数値列にわたって AND 条件をつなぐことはできますが、それが扱えるのは包含だけです。距離クエリには対応できず、行の属性を 1 つにまとまった幾何学的な値として扱うこともできません。VillageSQL の vsql_cube 拡張機能は cube カスタム型を追加し、どちらの種類のクエリも自然に書けるようにします。

問題

各製品に価格、平均評価、およびレビュー数がある製品カタログがあるとします。購入者は、価格が 50~200 ドル、評価が 3.5 以上、レビューが 50 件以上の製品を求めています。これは 3 条件の AND です。
AND のつながりは一致を見つけます。しかし、ある製品に最も似た 5 つの製品、つまり価格、評価、およびレビュー数が同時に最も近いものが欲しい場合、SQL に自然な答えはありません。候補をアプリケーションコードに取り出し、そこで距離を計算しなければなりません。

VillageSQL の場合: cube 型

cube 型は、n 次元空間の点またはボックスを格納します。点は位置であり、ボックスは 2 つの角の座標で定義される領域です。どちらも通常の列に格納されます。
cube は MySQL の予約語なので、DDL ではバッククォートで囲みます。次元パラメータ(3)は必須です。数値のない素の cube はサポートされていません。

データの挿入

座標の文字列を直接挿入し、列自身の変換に解析させます。cube_point_nd() で 包まないでください。それはパラメータなしの cube を返し、次元パラメータ付きの cube(3) 列に暗黙的にキャストできません(ERROR 3219)。
ここでの座標は (price, rating, review_count) で、製品ごとに 1 つの点です。

cube_contains による範囲クエリ

検索領域をボックスとして定義します。cube_box_nd() は下側の角の座標に続いて上側の角の座標を受け取るため、3 次元のボックスには 6 つの数値を渡します。
cube_contains(@region, attrs) は、製品の点がボックスの中にあるとき 1 を返します。3 つの AND 条件すべてを一度に書いたものと等価ですが、距離クエリと組み合わせることもできます。

cube_distance による最近傍

ある製品に最も似た製品を見つけるには、属性空間でのユークリッド距離を測ります。
スケーリングについての注意: 価格は数百、評価は 0~5、レビュー数は数千になることがあります。生のユークリッド距離はレビュー数に支配されます。バランスの取れた類似度スコアが欲しい場合は、挿入する前に 3 つの次元すべてを共通のスケール(例: 0~1)に正規化してください。

重なりの確認

cube_overlaps() は、2 つのボックスが何らかの空間を共有する場合に 1 を返します。製品がいくつかのプロモーション帯のいずれかに該当するかどうかを確認するのに役立ちます。

トラブルシューティング

関連項目