2017-10-01 10 views
0

以上の方がよいでしょうか?mysqlで文字列形式で保存しても構いませんか?

私はブックマークを保存したいと思います。私はそれを定義するタグの階層を保持する文字列形式の配列であるタグ列が必要です。たとえば、次のように

url | tag 
'stackoverflow.com', '[faves, internet, QandA]' 

私の現在の表は以下の通りです、と私は単なる文字列形式の配列を保持するためにtag列を変更したいです。

enter code here

+0

いいえ、それはまったく良い方法ではありません。文字列にタグを格納することで、条件付きでタグを使用するなどの特定の機能が失われます。タグの新しいテーブルを作成することを検討してください。 –

答えて

1

いいえ、それは文字列にカンマ区切りのリストを保存するために通常は良い考えではありません。

例外:クエリで常に文字列全体が文字列として扱われ、個々の要素を検索するためにSQL式を使用する必要がない場合は、これを実行しても問題ありません。

SQLでは、各列を配列ではなく単一のスカラー値として扱う方がよいでしょう。データを扱う作業は、列をサブパーツに分解できるものとして扱うと、扱いにくく非効率的になります。

タグの場合、各ブックマークをタグテーブルの1行に1つずつ、多くのタグで参照できるように、1対多タグテーブルが必要です。

本当は、タグのルックアップテーブル、次に多対多テーブルのブックマークをタグにマッピングします。

CREATE TABLE Tag (
    tag_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    tag VARCHAR(50) NOT NULL 
); 

CREATE TABLE BookmarkTag (
    bookmark_id INT NOT NULL, 
    tag_id  INT NOT NULL, 
    PRIMARY KEY (bookmark_id, tag_id), 
    FOREIGN KEY (bookmark_id) REFERENCES Bookmark(bookmark_id), 
    FOREIGN KEY (tag_id) REFERENCES Tag(tag_id) 
); 

これは、たとえば、あなたがより多くの柔軟性を提供します:

  • 簡単にどのようにカウントする特定のタグ
  • 簡単に検索するためのブックマーク
  • あたりのタグの数に制限なしブックマークごとに多数のタグがあります
  • 重複を防ぎ、許可されたタグを制御し、それを使用するすべてのブックマークから特定のタグを削除します。

も参照してください。私の答えはIs storing a delimited list in a database column really that bad?

+0

この質問に既に別の質問で回答している場合は、その質問を重複して閉じるように投票する必要があります。 – Shadow

+0

@ Shadowでは、答えが同じでも質問は同一ではありません。私が重複して質問を終わらせると、私は他のユーザーから、私がそれを不適切に閉鎖したという苦情を受ける可能性が高い。 –

+0

彼らです。どちらも、1つのフィールド内に区切られた形式でデータを格納することが望ましいかどうかを尋ねます。 – Shadow

関連する問題