web-dev-qa-db-ja.com

スーパータイプとサブタイプ

スーパータイプ/サブタイプを持つデータベースを設計しようとしています。次のユーザーがいます:
- 基本的なユーザー
-ビジネスユーザー
-管理者(スーパーユーザー)。

3人のユーザーはすべて、名前、電子メール、パスワードなどのフィールドが格納される共通のテーブル(ユーザー)を共有します。ただし、ビジネスユーザーは、business_name、business_license、business_emailなどのビジネスフィールドが格納される個別のテーブル(ビジネス)を持っています。私の問題は、ビジネスユーザー自身が5つ以上のカテゴリに分かれていることです。
私のビジネスユーザーは次のように分かれています。

  1. 画家
  2. 車両詳細
  3. ロットアテンダント
  4. サービス技術者:
    1. エンジン技術者
    2. 伝送技術者
    3. コンピュータ技術者
    4. 電気技術者
  5. 営業担当者
    1. 物理的な場所の営業担当者
    2. インターネット営業担当
    3. 営業部長

私は現在このデータベースを設計しましたが、本当に満足していません。より良いアプローチはありますか?

enter image description here

EDIT 1業種とサブタイプに異なるフィールドがないことを説明する必要があります。ビジネステーブルには、必要なものがすべて含まれています。ビジネスタイプとサブタイプはENUMに似ていますが、テーブルに保持されます。

EDIT 2
私が必要とするSELECTの例。より正確には、結果は次のようになります。

username       | user_type   | business_name    | business_type      | business_subtype  

John Doe       | business    | AUDI Dealership  | service technician | engine mechanic  
Mary Liu       | basic user  | NULL             | NULL               | NULL
George Vangh   | super user  | NULL             | NULL               | NULL
Martha Ayla    | business    | AUDI Dealership  | sales              | sales representative  
Carlos M       | business    | Ford & Lincoln   | sales              | sales manager

更新3
この例をオンラインで見つけたので、試してみようと思いました。これは受け入れられますか?

enter image description here

3
Cristian

はい、Update 3のコードは機能し、必要な情報を選択できます。あなたがそれに慣れているなら、それのために行きます。これは、サブタイプとスーパータイプの両方でPainterタイプを複製するか、スーパータイプなしでPainterをサブタイプのままにする必要があることを覚えておいてください。どちらにしても、これは少し厄介ですが実行可能です。

テーブルが本当にあなたの言うほど小さいと想定し、ビジネスデータを1つのテーブルに圧縮することを検討する必要があると思われるほど単純な要件を想定します。他のソリューションほどセクシーには見えませんが、CRUDの操作は非常に簡単です。 MySqlをよく知らないので、ばかげた構文エラーを許しません:

CREATE TABLE users (user_id INT NOT NULL, user_type_id INT NOT NULL, busniess_id INT, etc);
CREATE TABLE user_type (user_type_id INT NOT NULL, name VARCHAR(50) );
CREATE TABLE business (business_id INT NOT NULL, business_name VARCHAR(50) NOT NULL, business_type_id INT NOT NULL, business_subtype_id INT, etc);
CREATE TABLE business_type (business_type_id INT NOT NULL, name VARCHAR(50) );
CREATE TABLE business_sub_type (business_sub_type_id INT NOT NULL, name VARCHAR(50) );

私が言ったようにそれはセクシーではありませんが、それは仕事を成し遂げるでしょう。 MySqlが チェック制約 を提供しないのは残念です。

もしあなたの要求がもっと複​​雑になるなら、私は真剣に再考します @ MDCCLの投稿 。私の直感は、これは私が想像できる大抵はばかげた解決策の中で最高の解決策だと言います。その質問に対する別の回答を引用するには:

MDCCLの回答は魅力的で、教育的で、おそらく正しいです(私の給与水準を超えていますが)。

1
Erik