2016-11-20 9 views
0

お互いのテーブルの関連付けに問題があります。
私の理解に基づいて作成したいものです。Mysql - 1つのテーブル内に2つの主キー - (自動インクリメントと1つの主キー - サブタイプ)

サービスをリクエストできる組織があり、さまざまなサービス(Service1、Service2、OtherServices)から選択できます。Service1-2は固定されており、固有の列名を持ちます(これは、組織がService1または2、フォームを記入する必要があります)、OtherServicesはフォームのないサービスです。したがって、adminが新しいサービスを追加すると、自動的にフォームのないサービスになるため、OtherServicesテーブルに反映されます。

すべてTrackingNoは、各サービスのサービスID自動インクリメント で1すべてのサービスから表サービスとRequestIDと1対1であるされているテーブルRequest_Serviceこの中

This is what my table looks like

+0

あなたはコンポジットキーに見ていました:

あなたのデータベーススキーマは次のようになりますか?ここにリンクがありますhttp://stackoverflow.com/questions/5835978/how-to-properly-create-composite-primary-keys-mysql –

答えて

0

への外部キーです状況では、サービスをドキュメント中心のストレージにして、リレーショナルデータ構造に格納するのではなく、データは当然ながらリレーショナルではないので、システム全体を簡単に書くことができ、このように設計すると効率が向上します。

ドキュメント中心とは、サービスがリクエストされると、アプリケーションはドキュメントテンプレートを使用してユーザーにフォームを提示し、ユーザーの入力を単一のドキュメントとしてキャプチャし、複数の列のデータや複数のテーブル。

ドキュメント形式には多くの選択肢がありますが、最も一般的なものの2つはJSONとXMLです。長所と短所の助けが必要な場合、私はこれが別の質問であるべきだと思います。

ドキュメントを保存するには、ファイルシステムまたはBigTableを使用します。リレーショナルデータベースでは、ドキュメントを単一の列として格納することもできますが、このオプションを避けるように強くお勧めします。

/*!40101 SET NAMES utf8mb4 */; 

CREATE DATABASE IF NOT EXISTS `services` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */; 
USE `services`; 

CREATE TABLE IF NOT EXISTS `organization` (
    `organization_id` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`organization_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 

CREATE TABLE IF NOT EXISTS `request_service` (
    `request_id` int(11) NOT NULL AUTO_INCREMENT, 
    `organization_id` int(11) NOT NULL, 
    `service_id` int(11) NOT NULL, 
    `service_type` int(11) NOT NULL, 
    `document` LONGTEXT NOT NULL COLLATE 'utf8mb4_unicode_ci', 
    `tracking_no` int(11) DEFAULT NULL, 
    PRIMARY KEY (`request_id`), 
    KEY `FK_request_service_service` (`service_id`), 
    KEY `FK_request_service_organization` (`organization_id`), 
    CONSTRAINT `FK_request_service_organization` FOREIGN KEY (`organization_id`) REFERENCES `organization` (`organization_id`), 
    CONSTRAINT `FK_request_service_service` FOREIGN KEY (`service_id`) REFERENCES `service` (`service_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 

CREATE TABLE IF NOT EXISTS `requirement` (
    `requirement_id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, 
    `requirement_type` int(11) NOT NULL, 
    PRIMARY KEY (`requirement_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 

CREATE TABLE IF NOT EXISTS `restriction` (
    `restriction_id` int(11) NOT NULL AUTO_INCREMENT, 
    `service_id` int(11) NOT NULL, 
    `is_allowed` bit(1) NOT NULL, 
    `for_active_only` bit(1) NOT NULL, 
    PRIMARY KEY (`restriction_id`), 
    KEY `FK_service_restrictions_service` (`service_id`), 
    CONSTRAINT `FK_service_restrictions_service` FOREIGN KEY (`service_id`) REFERENCES `service` (`service_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 

CREATE TABLE IF NOT EXISTS `service` (
    `service_id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, 
    `requirement_id` int(11) NOT NULL, 
    PRIMARY KEY (`service_id`), 
    KEY `FK_service_list_of_requirement` (`requirement_id`), 
    CONSTRAINT `FK_service_list_of_requirement` FOREIGN KEY (`requirement_id`) REFERENCES `requirement` (`requirement_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 
+0

私が知っている、私がしたテーブルはありそうもありません。だから私は何かが間違っていると思うのです。とにかく、私は最近ドキュメント指向のデータベースを発見しましたが、問題はphpmyadminからのmysqlしか使えないということです。だから私は他のオプションをjusst JSONを使用して、またはファイルシステムを使用して単一のクーミンに文書を格納すると思う。 –

+0

あなたが私のアドバイスに従えば、設計から3つの厄介なテーブルを削除し、単にサービスリクエストにサービスに参加できます。これにより、設計が大幅に簡略化され、将来的に新しい種類のサービスを追加することも容易になります。 – bikeman868

+0

3つの厄介なテーブル(サービス1,2およびその他のサービス)を削除した場合、入力に応じて、組織がどのサービスを反映するのでしょうか?あなたが述べた解決策を使って? :) –

関連する問題