2011-01-22 9 views
1

私のデータベースには、CompanyIdとNameの列を持つ企業のリストがあります。 さらに、ユーザーがおり、ユーザーは製品を追加できます。 テーブル:userおよびuser_products 製品を定義する商品テーブルはありません。ユーザごとに一意です。したがって、「user_product」データベース関係の問題

ユーザーが商品を追加すると、会社の名前を入力します。その会社名が会社のテーブルに存在する場合は、user_productに名前のみを保存するのではなく、会社のテーブルに接続したいと考えています。これまでのところとても良い..私は単にCompanyIdをuser_productテーブルに保存するだけです。

問題は、ユーザーが会社のテーブルに存在しない名前を入力した場合です。名前をvarcharとして保存するのではなく、user_companyというテーブルに新しいレコードを作成します。 テーブルにはカラムがあります:UserCompanyId(PK)、UserId、Name。 NameとUserIdの組み合わせがすでに存在する場合、私はもちろんこのIDへの参照だけを新しい行には作成しません。

良いデータベース設計を維持するにはどうすればよいですか?このレコードと、UserCompanyIdという新しい列をuser_productに追加する必要があります。 CompanyIdまたはUserCompanyIdは、新しい行を追加するときに常に設定されます。これはより良い方法でこれができるように感じます。誰もがアイデアを持っていますか?

私はもちろん、テーブル "company"を1つしか持たず、システムによって追加されたグローバル企業である場合にnullの列UserIdを持つことができます。または、ユーザーIDが、世界中に存在した。これはどちらかというと気分が良くない...

+0

おそらく、製品のテーブルがないという事実があなたの問題の一部です。そして、統合失調症のテーブルではなく、企業の明確なリストを持っているべきです。新しく追加された会社には、管理プロセスによって正しいと判断されるまで「暫定」としてマークすることができます。また、エントリを追加したUserIDをメモすることもできます。または、CompaniesテーブルにもUserID列が必要です。すべての企業はユーザー定義であり、表には(CompanyID、UserID)と(Name、UserID)の2つの固有の制約があります。また、ユーザーが自分のユーザーIDに対して会社のエントリのみを使用するように要求することもできます。 Aconventional、but ... –

+0

世界中に多くの異なるランゲージと非常に多くの企業が加わっているので、それを管理する方法はありません。はい、ユーザーは自分の会社だけでなく、グローバルに追加されたUserIdのないユーザーも使用できます。 – Andreas

答えて

2

実際、私はあなたが最後の段落でそれを釘付けにしたと思う。企業はユーザーによって定義されているか、定義されていないため、userIdはnull可の列として意味があります。これにより、会社名に一意のキーを持たせることができます。これにより、データベースを使用して、会社名を複製できないという事実を強制することができます。

会社を定義するための会社テーブルが存在します。ユーザー(またはユーザー)が会社を作成したのは会社に関する単なる情報です。

+0

これは意味があるかもしれません..ユーザー2はユーザー3によって追加された会社を使用することはできません。しかし、それは私がこの設定で推測する問題ではありませんか?これはまた、そのテーブル内のユニークなキーとして名前を持つことが不可能になります、私は自動incrを使用する必要があります。代わりにPK id。 – Andreas

+0

サンダー:実際、米国の会社名は必ずしも一意ではありません。特定の地理的な制限(通常はビジネスライセンスの発行に関する)や特定の法的な制限(地理的な制限と重複する可能性のある商標や消費者保護の問題に関連するもの)内でのみユニークです。 –

+0

私は、「問題は、ユーザーが会社のテーブルに存在しない名前を入力したときです」という疑問の一部に基づいていると仮定していました。再読み込み時には、ユニークな制約がユーザー+会社名に適用されるようにします(ユニークな会社名がインテントであると仮定します)。 –