Вставить многозначное значение, структура базы данных MYSQL - PullRequest
0 голосов
/ 27 июня 2018

Следующие коды являются примерами, которые я придумал, чтобы изобразить мою ситуацию.

У меня есть 3 html «Выбор» с несколькими вариантами. Каждый день пользователи должны выбирать как минимум одну опцию для каждого «Выбрать».

<html>
<head></head>
<body>
<form id="frm" action="Save.php" method="POST">
<input type="text" id="datepicker" name="datepicker" readonly='true'>
<select id="OptionType1" multiple="multiple">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
</select>
<select id="OptionType2" multiple="multiple">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
</select>
<select id="OptionType3" multiple="multiple">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
</select>
</form>
</body></html>

CREATE TABLE `m` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Client ID` int(11) DEFAULT '0',
`Date` date DEFAULT NULL,
`Category` int(11) DEFAULT '0' COMMENT 'categoryA-1,categoryB-2,categoryC-3',
`OptionsType1` int(11) DEFAULT '0',
`OptionsType2` int(11) DEFAULT '0',
`OptionsType3` int(11) DEFAULT '0',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Эта структура БД может принимать только одно значение OptionType каждый.

Client ID, Date, Category используются для создания уникального индекса. Уникальный индекс используется для «Вставка в ... ON Duplicate Key Update». Причина, по которой я использовал уникальный индекс, заключается в том, что пользователь может вернуться и отредактировать свой параметр, и mysql обновит его на основе уникального индекса.

Из-за уникального индекса я не могу создать несколько строк с одинаковыми Client ID, Date, Category. Единственный другой вариант - объединить мои значения в одной строке, но это может вызвать проблемы с производительностью, если я решу поискать эти значения в дальнейшем.

Может кто-нибудь помочь мне с этой дилеммой. Мне нужна правильная структура, чтобы сохранить мои множественные значения и иметь возможность загрузить его обратно в HTML и иметь возможность пользователю обновить его. Спасибо

UPDATE: Созданы две таблицы

CREATE TABLE `m` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Client ID` int(11) DEFAULT '0',
`Date` date DEFAULT NULL,
`Category` int(11) DEFAULT '0' COMMENT 'categoryA-1,categoryB-2,categoryC-3',
PRIMARY KEY (`ID`),
UNIQUE KEY `uniq` (`Client ID`,`Date`,`Category`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `c` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`OptionsType1` int(11) DEFAULT '0',
`OptionsType2` int(11) DEFAULT '0',
`OptionsType3` int(11) DEFAULT '0',
`REF ID` int(11) DEFAULT '0',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Есть ли способ заменить существующие данные (c таблицей) без удаления. Уникальный индекс не существует в таблице c только первичный ключ, но я не отслеживаю это при загрузке формы HTML.

1 Ответ

0 голосов
/ 27 июня 2018

Если вы не хотите объединять, вы можете создать новую таблицу только для значений и ссылки на таблицу m.

Для таблицы m вы можете заменить поля OptionsType [1-3] одним столбцом, в котором сохраняется номер типа OptionsType, и добавив этот новый столбец в общий уникальный ключ.

В таблице значений вы ссылаетесь на идентификатор таблицы m и помещаете в нее номер опции и выбор пользователя.


Для уточнения решения после того, как справочная таблица будет принята и вопрос будет откорректирован:

Сначала я показываю создание таблицы, а потом объясняю.

Таблица m

CREATE TABLE `m` ( `ID` INT(11) NOT NULL AUTO_INCREMENT, `Client ID` INT(11) NOT NULL, `Date` DATE NOT NULL, `Category` INT(11) NOT NULL COMMENT 'categoryA-1,categoryB-2,categoryC-3', `OptionsType` INT(11) NOT NULL, PRIMARY KEY (`ID`), UNIQUE INDEX `Client ID_Date_Category_OptionsType` (`Client ID`, `Date`, `Category`, `OptionsType`) ) ENGINE=InnoDB;

Таблица c

CREATE TABLE `c` ( `ID` INT(11) NOT NULL AUTO_INCREMENT, `mID` INT(11) NOT NULL, `Option` INT(11) NOT NULL, `Value` INT(11) NOT NULL, PRIMARY KEY (`ID`), UNIQUE INDEX `mID_Option` (`mID`, `Option`), INDEX `mID` (`mID`) ) ENGINE=InnoDB;

Объяснение

Добавить OptionsType в таблицу m. В таблице c вы ссылаетесь на таблицу m через m.ID=c.mID. Чтобы убедиться, что дубликаты не сохраняются, для уникальных индексов устанавливаются значения mID и Option. В столбце Option указано, на какую опцию ссылаются, а value показывает выбор пользователя. С этой схемой вы также не ограничены тремя вариантами выбора.

Пример запроса

SELECT * FROM `m` INNER JOIN `c` ON `m`.`ID`=`c`.`mID`; +----+-----------+------------+----------+-------------+----+-----+--------+-------+ | ID | Client ID | Date | Category | OptionsType | ID | mID | Option | Value | +----+-----------+------------+----------+-------------+----+-----+--------+-------+ | 1 | 4711 | 2018-06-27 | 1 | 1 | 1 | 1 | 1 | 0 | | 1 | 4711 | 2018-06-27 | 1 | 1 | 2 | 1 | 2 | 1 | | 1 | 4711 | 2018-06-27 | 1 | 1 | 3 | 1 | 3 | 0 | | 3 | 4711 | 2018-06-27 | 1 | 2 | 7 | 3 | 1 | 0 | | 3 | 4711 | 2018-06-27 | 1 | 2 | 8 | 3 | 2 | 1 | | 3 | 4711 | 2018-06-27 | 1 | 2 | 9 | 3 | 3 | 0 | +----+-----------+------------+----------+-------------+----+-----+--------+-------+ 6 rows in set (0.00 sec)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...