0

CCGカードのデータベースを設定中です。各カードには「稲妻」や「水」などのキーワードがあり、カードごとに複数のキーワードを含めることができます。

したがって、質問は、「各キーワードを独自のフィールドに入れて、カードにあるかどうかを保存するのが良いですか、それともすべてのキーワードを1つのフィールドに保存して、それらを解析するか、検索機能のために何かをするのが良いですか?」

カードゲームは将来、さらに多くのキーワードを追加する可能性があり、キーワードと同じ原則に従うカードの複数の側面があります(つまり、1つのフィールドに多くのオプションがあります)。

50列以上のテーブルがあるのではないかと少し心配です。事前にすべてのヘルプと回答をありがとう。明確にする必要がある場合は、私に知らせてください。

4

3 に答える 3

5

ない。

カードとキーワードの組み合わせごとに1行のテーブルが必要です。

すなわち

CardID   Keyword
1        lightning
1        water
2        lightning
3        mountain

キーワードを繰り返す場合は、キーワードテーブルを追加し、代わりにこのジャンクションテーブルにIDを含めることをお勧めします。

CardID   KeywordID
1        1
1        2
2        1
3        3

キーワード

KeywordID Keyword
1         Lightning
2         Water
3         Mountain

これは「正規化」と呼ばれます。意見はさまざまですが、私見では、一般的に、少なくとも「第3正規形」、できればそれ以上を目指す必要があります。

于 2012-08-31T18:12:09.103 に答える
2

キーワードに個別にアクセスしているが、それらを同じフィールドに一緒に格納している場合は、原子性の原則に違反しているため、第一正規形に違反しています。

これは悪いです!せいぜい、データを効率的に検索することはできず1、最悪の場合、無効なデータに対してデータベースを無防備にすることになります2

したがって、各キーワードを個別のフィールドに確実に保持しますが、必ずしもこれらのフィールドが異なる列にある必要があることを意味するわけではありません。どういうわけか異なって扱われるべき異なった種類のキーワードがあるなら、これらの種類のそれぞれのための列を持つことは理にかなっています。また、カードごとのキーワードが少数に制限されている場合は、別々の列が正当化される可能性があります。3

ただし、あなたの場合、すべてのキーワードが同等に扱われ、それらの数に制限は必要ないため、podiluskaがすでに説明したように、古典的な1対多の関係につながると思います。


1インデックスは「部分的な」フィールドでは機能しません。

2たとえば、同じフィールド内でキーワードを区切るために使用される文字が、バグのために、または意図的にさえも、キーワード自体の一部として指定された場合はどうなりますか?長さの制限、大文字/小文字の制限は必要ですか?など...これらはすべて、理論的にはアプリケーションレベルで実施できますが、データベースレベルで実施することが望ましいのには十分な理由があります。

3このような制限を課すには、間違いなくより良い解決策がありますが。

于 2012-08-31T18:49:02.643 に答える
1

ここで、非正規化(フィールド内の多くの値のような非第一正規形の設計を含む)は高度なものであり、問​​題が発生する可能性が高いことを付け加えておきます。必要な場合もありますが、これまでのところ、理由は示されていません。また、このようなものを使用する場合は、自分が何をしているかを確実に把握し、必要に応じてデータを正規化された形式に分割できることを確認する必要があります。

したがって、正規化された形式から始めます。ここで質問している場合は、正規化について読み、それを使用する方法を学びます。次に、(通常はデータ制約を表現するために)必要な場合にのみ、必要な範囲で非正規化します。どちらが優れているかを尋ねていて、フィールドで多くの値を使用する理由があまりない場合は、他のコメント提供者が示唆しているように、別のテーブルに分割することをお勧めします。

于 2012-09-02T10:46:18.503 に答える