0

Items-Groups関係を維持するために2つのテーブルを使用しています。

2つの列と。を持つitemsテーブルがあります。 ItemNameGroups

もう1つのテーブルはGroup、列がありますGroupName

ユーザーは、各アイテムに1つ以上のグループを追加します。次に、ユーザーはそのグループに割り当てられているアイテムの数を照会します。

GroupName現在、 toGroups列を追加しており%Groups%、whereクエリで使用するグループの数をクエリしていません。

しかし、ユーザーが同じグループを2回追加した場合は、確認して削除する必要があります。

これらの関係を維持するためのより良い方法はありますか?

4

2 に答える 2

1

グループのフィールドを連結すると、データベースの整合性の自動化が妨げられ、インデックス作成が禁止されるため、特定のクエリは非常に遅くなります。

主キーItemIdをItemsに追加(または変更)し、外部キーItemIdをGroupに含めます。次にSELECT COUNT(*) FROM Group WHERE ItemId = X、アイテムに割り当てられたグループの数を取得するために行うことができます。

上記は、多対多の関係である場合、グループ化するアイテムの1対多の関係を前提としています。

Groupの外部キーの代わりに、別のテーブルがありますItemGroupMapping(ItemId FK, GroupId FK)

また、主キーGroupIdをGroupに追加することは、優れたデータベース設計にとっては良い考えかもしれません。

于 2013-01-30T06:54:30.667 に答える
1

1つの列に複数のアイテムを保存しようとしないでください(*)。

代わりに、3つのテーブル-、、およびを作成ItemsGroupsますItemGroupsItemGroupsアイテムが属するグループごとに1行を格納します。例:

CREATE TABLE ItemGroups (
     ItemID int not null,
     GroupID int not null,
     constraint FK_ItemGroups_Items FOREIGN KEY (ItemID) references Items (ItemID),
     constraint FK_ItemGroups_Groups FOREIGN KEY (GroupID) references Groups (GroupID),
     constraint PK_ItemGroups PRIMARY KEY (ItemID,GroupID)
)

に主キーを追加することで、ItemID,GroupID重複が発生するのを防ぎ、それ以上の作業を行わないことに注意してください。


(*)SQLには、複数の項目を含むように設計された1つのデータ構造があります。配列、リスト、辞書などはありません。構造は1つだけです。そしてそれはテーブルと呼ばれます。この構造を使用すると、うまく機能します。たとえば、単一の列に格納されている文字列値を使用して他の種類の構造を偽造しようとすると、物事はほとんどうまく機能しません。

于 2013-01-30T07:46:26.740 に答える