sql >> データベース >  >> RDS >> Mysql

関連するタグ検索用にMYSQLデータベースを設定する正しい方法は?

    データエンティティを、それらが何であるか、そしてそれらが何を意味するかによって分離するだけです。 titleの場合 、tags およびfile 2つのエンティティがあるようです:

    Picture
    ----------
    ID
    Title
    File
    
    Tag
    ----------
    ID
    Name
    

    つまり、title およびfile (あなたの場合、それをファイルシステム上のファイルへのパスとして保存していると思いますが、これは問題ありません)1つのエンティティとtag 独自の独立したエンティティです。各Picture 複数のtagsを持つことができます sおよび各tags 複数のPictureに関連付けることができます s、それは多対多の関係です。したがって、通常、データベースでそれらをリンクするためのサポートする非エンティティテーブルを作成します。

    PictureTagRelationship
    ----------
    PictureID
    TagID
    

    これにより、Pictureを取得できます :

    SELECT Picture.Title, Picture.File FROM Picture WHERE Picture.ID = ?id
    

    とそのタグ:

    SELECT Tag.ID, Tag.Name FROM Tag
    INNER JOIN PictureTagRelationship ON Tag.ID = PictureTagRelationship.TagID
    WHERE PictureTagRelationship.PictureID = ?id
    

    (1つのクエリでいくつかの方法でそれを行うこともできます。簡単にするために2つに分割します。2つのクエリは大したことではありませんが、データベースアクセスのオーバーヘッドを高度に最適化する必要がある場合、または本当に単一のクエリにしたいので、何かできると確信しています。)

    または、特定のタグのすべての写真を取得できます:

    SELECT Picture.ID, Picture.Title, Picture.File FROM Picture
    INNER JOIN PictureTagRelationship ON Picture.ID = PictureTagRelationship.PictureID
    WHERE PictureTagRelationship.TagID = ?id
    

    この設計に加えることができる他の微調整や、データを表示およびレポートするための他の多くの方法があります。しかし、これらすべてにおいて1つの重要なポイントがあります:

    データの保存にカンマ区切りのリストを使用しないでください。 各データエンティティを独自の構造に正規化し、それに応じて保存します。リレーショナルデータベースは、そのようなことには最適です。ただし、個別のデータ要素を区切り文字列として格納すると、それらの要素の分離が失われます。これにより、そのデータの報告がより困難になり、データとのやり取りがより困難になります。ロット 更新するのがより難しく、それをサポートする必要のある他の人には直感的ではありません。

    データベース内の1つのフィールドには、1つの情報のみを格納する必要があることを覚えておいてください。 1つの情報。複数の情報を1つのフィールドに詰め込む必要がある場合は、リレーショナルデータベースを適切に使用していません。




    1. idが別のテーブルに存在する場合は、列をtrue/falseとして選択します

    2. BLOBファイル/画像をMysqlにアップロードする

    3. SASJMPをSalesforce.comに接続する

    4. SQL IF SELECTクエリがnullの場合、別のクエリを実行します