2016-11-20 2 views
0

У меня возникают проблемы с привязкой таблиц друг от друга.
Вот что я хочу создать на основе моего понимания.Mysql - Два основных ключа в одной таблице - (автоинкремент и один - один первичный ключ - подтип)

У меня есть организация, которая может запросить услугу, он может выбирать из разных служб (Service1, Service2, OtherServices). Service1-2 являются фиксированными и имеют свои собственные имена конкретных столбцов (это означает, что когда запрос организации Service1 или 2, они должны заполнить форму), в то время как OtherServices - это службы без форм. Поэтому, если администратор добавит новую услугу, он автоматически станет сервисом без форм, поэтому будет отражен в таблице OtherServices.

Все TrackingNo является автоинкрементным ServiceID от каждых Услуг 1 являются 1-к-1 с таблицей услугами и RequestID из каждых услуг внешний ключа к таблице Request_Service

This is what my table looks like

+0

ли вы посмотреть в составные ключи? Вот ссылка http://stackoverflow.com/questions/5835978/how-to-properly-create-composite-primary-keys-mysql –

ответ

0

В этом ситуации я бы пошел на хранение документов, ориентированных на документ, вместо того, чтобы принуждать их к реляционной структуре данных. Данные не являются естественно реляционными, поэтому вся система будет легче писать и намного эффективнее, если вы ее разработаете таким образом.

Под документом, что я имею в виду, является то, что когда запрашивается услуга, приложение использует шаблон документа для представления формы пользователю, а затем захватывает пользователя как отдельный документ, а не несколько столбцов данных или нескольких таблиц ,

Существует много вариантов формата документа, два из наиболее популярных - 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

Я знаю, таблица, которую я сделал, маловероятна. Вот почему я думаю, что что-то не так. во всяком случае, я недавно обнаружил документы, ориентированные на базы данных, но проблема в том, что я могу использовать mysql (из phpmyadmin). Поэтому я думаю, что мои другие параметры будут jusst хранить документы в одном кубе с помощью JSON или даже с использованием файловой системы. –

+0

Если вы следуете моему совету, вы можете удалить три неудобные таблицы из своего проекта и просто присоединить службу к запросу службы. Это значительно упростит ваш дизайн, а также упростит добавление новых видов услуг в будущем. – bikeman868

+0

если я удалю 3 неудобные таблицы (service1,2 и другие службы), как я буду отражать, какую услугу организация делает, в зависимости от его ввода? используя решение, которое вы указали? :) –

Смежные вопросы