2016-01-29 4 views
0

Я не очень хорошо разбираюсь в создании таблиц MySQL.Ticketsystem: sql tables

Я хочу создать небольшую систему продажи билетов, где пользователь может применить следующую информацию:

  • имя пользователя Ticket
  • электронный билет
  • Вопрос

Snapshot

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

Теперь сторонник и пользователь должны иметь возможность добавить комментарии к этому билету.

Я пытался создать таблицы, но я немного волновался, если он будет работать так:

CREATE TABLE IF NOT EXISTS `Tickets` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `username` varchar(20) NOT NULL, 
    `email` varchar(50) NOT NULL, 
    `ticket_id` varchar(30) NOT NULL, 
    `ticket_question` varchar(255) NOT NULL, 
    `ticket_status` tinyint(1) NOT NULL DEFAULT '0', 
    `ticket_creation_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
    PRIMARY KEY (`ticket_id`), 
    UNIQUE KEY `username` (`username`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=203 ; 

CREATE TABLE IF NOT EXISTS `Conversation` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `ticket_id` varchar(30) NOT NULL, 
    `ticket_comment` varchar(255) NOT NULL, 
    `ticket_latest_reply` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
    PRIMARY KEY (`ticket_id`), 
    UNIQUE KEY `username` (`username`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=203 ; 

Может кто-нибудь взглянуть на это или исправить меня?

+0

У вас должна быть другая таблица для каждого комментария. Что-то вроде «Conversation_Comment» –

+0

Чтобы сохранить все комментарии, связанные с ticket_id? В случае «да» я планировал сохранить их в таблице «Разговор» – stackxquestion

+0

Если вы имеете в виду, что ваша вторая таблица будет содержать много записей для каждой записи в «билетах», тогда это нормально для черновика (после этого вам понадобится больше таблиц). Но удалите уникальное ключевое имя пользователя из второй таблицы и добавьте в него информацию о пользователе. На самом деле вам может понадобиться целая новая пользовательская таблица, которая будет привязана к таблице билета и таблице комментариев \ бесед. – user15

ответ

2

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

Вы должны установить id в качестве pirmary ключа ConversationTable и ticket_id в качестве внешнего ключа к Ticket таблиц ticket_id, потому что вы можете иметь несколько комментариев к одному билету

CREATE TABLE IF NOT EXISTS `Tickets` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `username` varchar(20) NOT NULL, 
    `email` varchar(50) NOT NULL, 
    `ticket_id` varchar(30) NOT NULL, 
    `ticket_question` varchar(255) NOT NULL, 
    `ticket_status` tinyint(1) NOT NULL DEFAULT '0', 
    `ticket_creation_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`ticket_id`), 
    UNIQUE KEY (`id`), 
    UNIQUE KEY `username` (`username`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `Conversation` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `ticket_id` varchar(30) NOT NULL, 
    `ticket_comments` varchar(255) NOT NULL, 
    `ticket_latest_reply` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    CONSTRAINT `fk_tickets` FOREIGN KEY (`ticket_id`) REFERENCES `Tickets`(`ticket_id`) ON UPDATE CASCADE ON DELETE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Внимание: Если теперь удалить TICKET_ID в вашем билетном столе это удалит все комментарии, связанные с этим билетом (ON DELETE CASCADE)

В этом случае каждый комментарий хранится в этой таблице.

Если вам нужен разговор в виде отдельного разговора, вам нужна дополнительная таблица, содержащая все комментарии и ссылки на комментарии в таблице Conversation по ID, как это делается с помощью ticket_comment, которую вы сделали выше.

CREATE TABLE IF NOT EXISTS `Tickets` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `username` varchar(20) NOT NULL, 
    `email` varchar(50) NOT NULL, 
    `ticket_id` varchar(30) NOT NULL, 
    `ticket_question` varchar(255) NOT NULL, 
    `ticket_status` tinyint(1) NOT NULL DEFAULT '0', 
    `ticket_creation_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`ticket_id`), 
    UNIQUE KEY (`id`), 
    UNIQUE KEY (`username`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `Conversation` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `ticket_id` varchar(30) NOT NULL, 
    `comment_id` int(11) NOT NULL, 
    `ticket_latest_reply` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY (`ticket_id`, `comment_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `Comments` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `comment` varchar(255) NOT NULL, 
    `comment_last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;  

А может быть, думают о создании ticket_id в качестве первичного ключа в Tickets. Когда он уникален, вы также можете использовать его в качестве первичного ключа.

+0

Получение следующей ошибки: # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии сервера MariaDB, для правильного синтаксиса для использования рядом с '('ticket_id'), UNIQUE KEY' username' ('username') ) ENGINE = InnoDB DEFAULT C' по строке 9 – stackxquestion

+0

Итак, таблица Билеты будут хранить информацию о билетах после того, как пользователь ее создал. Таблица разговора хранит информацию между таблицей билетов и комментариями, В таблице «Комментарии» будут храниться все комментарии от каждого билета? – stackxquestion

+0

Правильно :) Надеюсь, что поможет – Andreas

1

Рабочий код:

CREATE TABLE IF NOT EXISTS `Tickets` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `username` varchar(20) NOT NULL, 
    `email` varchar(50) NOT NULL, 
    `ticket_id` varchar(30) NOT NULL, 
    `ticket_question` varchar(255) NOT NULL, 
    `ticket_status` tinyint(1) NOT NULL DEFAULT 0, 
    `ticket_creation_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY (`username`, `ticket_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=203 ; 

CREATE TABLE IF NOT EXISTS `Conversation` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `ticket_id` varchar(30) NOT NULL, 
    `ticket_comments` varchar(255) NOT NULL, 
    `ticket_latest_reply` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=203 ; 

SqlFiddle: http://www.sqlfiddle.com/#!9/36aca1

Вещи, которые были неправильно:

  • Ключ с автоматическим приращением должно быть первичным ключом.
  • Как вы хотите ticket_id быть уникальным, определить его как уникальный ключ.
  • Был , missig после CURRENT_TIMESTAMP в первом запросе.
  • Нет столбца имени пользователя, поэтому вы не можете определить его как уникальный во втором запросе.
  • И этот запрос находится в MySql, а не в sql. Поместите соответствующие теги на свой вопрос со следующего раза.
+0

Это рабочий код, конечно. Но с этой настройкой не может быть более одного комментария для каждого билета 'ticket_id', beacuse' ticket_id' в таблице «Беседа» уникальна – Andreas

+0

Ой, мой плохой. Я просто решил ошибки. Не искали функциональность. Спасибо –

+0

Ваше приветствие. Вы решили те проблемы, которые я забыл;) – Andreas