1

商品のデータベースを作りたい。各製品には、x 値と対応する y 値の配列として記述された特性があります。そして、特定の特性について製品を照会したいと思います。

商品データの例:

ProductA_x = [10, 20, 30, 40, 50]
ProductA_y = [2, 10, 30, 43, 49]

ProductB_x = [11, 22, 33, 44, 55, 66]
ProductB_y = [13, 20, 42, 35, 28, 21]

ここで、y < 35 @ x=31 の製品のリストを取得したいと考えています。サンプル データのケースでは、ProductA を取得する必要があります。

  • MySQL を使用している場合、SQL レベルでこのクエリを実行するためにテーブルを定義する良い方法は何でしょうか?
  • PostgreSQL を使えばもっと簡単になりますか? (Array 型か JSON 型か??)

私がアドバイスされた方法の 1 つは、x 範囲の xy ペアを指定するテーブルを作成することでした。最初のデータは x[0] から x[1] の範囲、次のデータは x[1] から x[2] の範囲です。このようなもの。

| ProductID | x1 | x2 | y1 | y2 |
| --------- | -- | -- | -- | -- |
| 1 | 10 | 20 | 2 | 10 |
| 1 | 20 | 30 | 10 | 30 |
| 1 | 30 | 40 | 30 | 43 |
| 1 | 40 | 50 | 43 | 49 |
| 2 | 11 | 22 | 33 | 44 |
| 2 | 22 | 33 | 20 | 42 |
| 2 | 33 | 44 | 42 | 35 |
| 2 | 44 | 55 | 35 | 28 |
| 2 | 55 | 66 | 28 | 21 |

次に、(x1 > 31 AND 31 < x2) AND (y1 < 35 OR y2 < 35) を照会できます。

この解決策はそれほど悪くはありませんが、より賢いアプローチがあるのではないかと思います。

x 配列はインクリメンタルであることが保証されていますが、製品によって開始 x 値、ステップ サイズ、ポイント数が異なることに注意してください。また、検索対象の x 値が x 配列に正確な値として存在しない場合があります。実際の x 配列と y 配列の長さは約 2000 になります。約 10,000 個の製品があると思います。

対応する y 値を補間できるのが最善ですが、最も近い x 値で y 値を検索してもかまいません。

4

1 に答える 1

0

すべての X は正確に 1 つの Y に対応するため、従来のリレーショナル データベースでの適切なテーブル定義は次のようになります。

CREATE TABLE product (id serial not null unique, sku text primary key, ....);
CREATE TABLE product_xy (product_id int not null references product(id),
                         x int not null,
                         y int not null,
                         primary key(product_id, x));

これにより、すべての場合でクエリが管理しやすくなります。

PostgreSQL 9.3 では、LATERAL サブクエリを使用して配列を効果的に使用できましたが、最初からリレーショナル デザインを使用するよりも簡単だとは思いません。PostgreSQL の配列に情報を格納したい唯一のケースは、x 配列で順序性が問題になる場合です。次の配列の組み合わせは意味的に同じではないため、設計は少し複雑になります。

 array[1, 2, 3] x
 array[4, 5, 6] y

 array[2, 1, 3] x
 array[5, 4, 6] y

それらを区別する必要がある場合は、PostgreSQL の配列ベースのソリューションを使用します (どちらの場合も、同じ x 値は同じ y 値に対応しますが、ペアの順序が異なることに注意してください)。それ以外の場合は、標準のリレーショナル デザインを使用します。それを行う必要がある場合は、次のような 2 次元の xy 配列を使用することをお勧めします。

 array[
    array[1, 2, 3],
    array[4, 5, 6]
 ] xy

次に、配列全体でこれらのペアを処理できる関数を使用できますが、ポイントは、この場合、xy が特定のドメイン内の単一の原子値を表し、両方の次元で序数が重要であるため、値を処理できることです。すぐに。つまり、順序性が両方の次元で重要な場合、ドメインには単一の値があるため、これは第 1 正規形に違反しません。いずれかの次元に沿った順序性が問題にならない場合、それは第 1 正規形に違反しています。

于 2013-11-16T05:03:34.573 に答える