1


0

データベースに「行へのポインタ」を設定する方法はありますか?

たとえば、X個の製品行があり、これらすべての行が異なる製品を表していますが、 "id"と "color_id"が異なる以外は同じフィールド値を持っています。

私は単に行を複製することを考えましたが、これは間違いを起こしやすいかもしれませんし、さらに小さな変更をいくつかの行で行わなければならないでしょう、これもバグです。

'' '' '

質問:いくつかの行を完全に埋めてから、特定のフィールド値を「指す」ために特別な値を使用する方法はありますか?

例えば:

id | field1 | field2 | field3 | color_id ----------------------------------------------- 1 |値1 |値2 |値3 |ブルー2 |ポイント[1]ポイント[1]ポイント[1]赤(IDと色以外は1行目と同じ)3 |ポイント[1]ポイント[1]ポイント[1]緑色(1行目と同じ、ただしIDと色は異なる)4 | valueA |値B |値C |オレンジ5ポイント[4]ポイント[4]ポイント[4]茶色(4行目と同じ、ただしIDと色は異なる)6 | valueX | valueY | valueZ |ピンク7 |ポイント[6]ポイント[6]ポイント[6]黄色(IDと色以外は6行目と同じ)

'' '' '

私はMySQLを使用していますが、これは一般的な質問です。 これがデータベース理論に完全に反する場合も、これがなぜ悪いのかについての説明があればありがたいです。

9 Answer


3


これはデータベース設計に反します。 正規化と関係代数の説明を探します。 それは主にあなたが「行を複製しますが、これはエラーを起こしやすいかもしれませんし、プラスいくつかの行で行わなければならないでしょう、これもまたバグがあるかもしれません」というコメントのせいで悪いです。

リレーショナルデータベースの概念は、一連のデータに基づいて行動し、主キーと外部キーを照合してものを見つけることであり、絶対にポインタを使用したり考えたりしないことです。

各商品に共通のデータがある場合は、商品テーブルを作成します。

product_idの主キーを持つテーブルproduct(product_id int、field1 ...、field2 ...、field3)を作成します。

メインテーブルには、id、color_id、product_idの各フィールドがあります。

商品表が以下のような場合

product_id | field1 | field2 | field3 ----------------------------------------------- 1 |値1 |値2 |値3 2 | valueA |値B |値C 3 | valueX | valueY | valueZ

メインテーブルは次のようになります

id | product_id | color_id -------------------------------- 1 | 1 |ブルー2 | 1 |赤3 | 1 |グリーン4 | 2 |オレンジ5 2 |ブラウン6 | 3 |ピンク7 | 3 |黄


2


データベース内の行へのポインタを持つ方法があることを確認してください。 リレーショナルDBMSを使わないでください。 1960年代と1970年代には、ポインターを他のレコード内のレコードに埋め込むことによって、レコード同士をリンクすることに完全に基づいていた、いくつかの非常に成功したDBMS製品がありました。 おそらく最も有名なのはIMSでした。

他のレコード内のレコードへのポインタを持つことのマイナス面は、結果のデータベースがリレーショナルデータベースよりもはるかに柔軟性に欠けることでした。 予定されたアクセスパスでは、ポインタのネットワーク上に構築されたデータベースは実際にはリレーショナルデータベースよりも高速です。 しかし、データを複数の方法で組み合わせたい場合は、柔軟性が欠如しているとあなたが命を落とすでしょう。

それが、リレーショナルDBMSが1980年代から1990年代にこの分野を引き継いだ理由です。

他の人が示唆しているように、あなたは正規化を学ぶべきです。 そうすると、各テーブルの列(フィールド)数が少なくなり、テーブルをより小さなテーブルに分解する方法がわかります。 データを結合方式で使用する必要がある場合は、リレーショナル結合を使用してデータを元に戻すことができます。 リレーショナル結合は、特に正しいインデックスを構築している場合は、ポインタによる移動と同じくらい高速になります。

正規化はあなたがあなたの質問で強調した問題である有害な冗長性を避けるのを助けるでしょう。


1


これを行う1つの方法は、繰り返しデータがあると思われる列を分離し、それを別の表に入れることです。 この新しいテーブルの各行に一意のIDを付けます。 新しいテーブルのIDを含む元のテーブルに列を追加します。 次に、元のテーブルと新しいテーブルのid列の間にFOREIGN KEY関係を使用します。


0


これは通常の状況下では正規化と呼ばれます。 その要点は、そのようなシナリオに対処することです。 だから、やりたくないようなことはできません。 データを正しく正規化する必要があります。


0


field1、field2、およびfield threeの値に別々のテーブルを作成します。 そこに既存の値を入れて、あなたの現在のテーブルにそれらのIDを入れてそれらを参照してください。


0


一般的な文字列値を使用している場合は、文字列を別のテーブルに格納し、それらを外部キーで参照することをお勧めします。 整数のようなものを格納しているのであれば、それだけの価値はありません。ポインタのサイズはデータ自体のサイズに匹敵します。


0


データベースの「関係」の部分を外に出しているので、データベース理論に反します。

それをする方法はあなたが指し示したい行のキーを含むObjectIDカラムを作ることです。

id | field1 | field2 | field3 | color_id | object_id | -------------------------------------------------- ---------- 1 |値1 |値2 |値3 |ブルー2 | null | null | null |赤| 1 | 3 | null | null | null |グリーン1 | 4 | valueA |値B |値C |オレンジ5 null | null | null |ブラウン4 | 6 | valueX | valueY | valueZ |ピンク7 | null | null | null |黄色|写真黄色6 |

'' '' '

しかし覚えておいてください:*これは悪い考えです。 *やりたくなければ、それはどうでしょうか。

必要な場合があります。しかし、これに蔓延しているシステムを扱った後は、データを複製してビジネスレイヤにすべてを真っ直ぐにさせることを意味していても、常に別の方法を探すようにします。

私はシステム全体でこれが行われていたシステムで作業していますが、誰かが賢いことを望んでいたためにリレーションシップの機能を再作成しなければならない場合は大変です。


-1


データベースにこれを実装する方法は、2つのテーブルを作成することです。

object_id | field1 | field2 | field3

そして

instance_id | object_id |色

そして2番目の行は最初の行を指しているので、あなたはその場で欲しいデータの完全なテーブルを生成することができます。

t1からt2を選択してt1。*、t2.colourを選択します(t1.object_id = t2.object_id)


-1


おそらく、外部キー関係を持つ2つのテーブルがあるはずです。

商品:IDフィールド1フィールド2フィールド3

ProductColors:Id ProductIdカラー