Сохранение записей в MySQL, которого не существует - PullRequest
0 голосов
/ 01 января 2019

Допустим, у меня есть предопределенная таблица с именем cities, в которой почти все города моей страны.

Когда пользователь регистрируется сам (таблица пользователя), столбец cities_id в таблице user сохраняет идентификатор города из таблицы cities (внешний ключ, таблица ссылок города), что-то вроде

CREATE TABLE `cities` (
    `id` int,
    `city_name` varchar(100)
)

CREATE TABLE `user` (
    `id` int,
    `name` varchar(60)
    `****`
    `cities_id` FK
)

В таблице пользователей хранится идентификатор города.

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

Могу ли я иметь еще один столбец city_name сразу после имени города в таблице user что-то вроде

CREATE TABLE `user` (
    `id` int,
    `name` varchar(60)
    `****`
    `cities_id` FK
    `citiy name` varchar(100)
)

для записи данных, введенных пользователемна момент регистрации?Можно ли это сделать?

Ответы [ 6 ]

0 голосов
/ 09 января 2019

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

CREATE TABLE `buffer_city_user` (
`buffer_id` int,
`city_name` varchar(100),
`user_name` varchar(100),
);

, вы можете сначала обработать таблицу буферов для новых названий городов - если найдены, вставить в таблицугорода.

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

0 голосов
/ 08 января 2019

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

Если вы разрешите оба параметра cities_id иcity_name чтобы можно было обнулять, вы можете проверить, что в логике приложения установлен только один и только один из них

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

Однако это добавит очень редкий столбец city_name в вашу таблицу

Я думаю, это зависит от того, как вы хотите получить город изпользователь (выпадающий + текстовое поле для других, текстовое поле с предложениями, просто текстовое поле) и то, что вы планируете делать с городами, которые вы собрали

Вы даже можете изменить метку на 'город(или ближайший город) 'с жестко заданным раскрывающимся списком или раскрывающимся списком с возможностью поиска и не разрешать введенные пользователем города

0 голосов
/ 05 января 2019

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

CREATE TABLE `cities` (
    `id` int,
    `city_name` varchar(100),
    `type` int,
)

CREATE TABLE `user` (
    `id` int,
    `name` varchar(60)
    `****`
    `cities_id` FK
)
0 голосов
/ 03 января 2019

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

0 голосов
/ 03 января 2019

Вот так я бы быстро решил это

Создайте дополнительную таблицу для хранения пропущенных городов, которая будет представлена ​​пользователями

CREATE TABLE `cities_users` (
`id` int,
`city_name` varchar(100),
`added_by` varchar(100),
`added_TS` DATETIME DEFAULT CURRENT_TIMESTAMP
);

Создать ВИДобъедините две таблицы городов:

CREATE VIEW all_cities AS
SELECT id, city_name FROM `cities`
UNION ALL
SELECT id, city_name FROM `cities_users`;

Всякий раз, когда пользователь регистрируется, вы запрашиваете VIEW, чтобы проверить, существует ли город пользователя.Таким образом, вы будете знать, существует ли город в вашей исходной таблице ИЛИ города, представленные пользователями.

Если нет, вы ВСТАВЛЯЕТЕ новый город в таблицу cities_users (вместе с пользователем, который его создал дляцели ведения журнала).

Вы должны правильно сгенерировать уникальный идентификатор, то есть тот, который никогда не может существовать в таблице city .Вы можете сделать это различными способами, вот небольшой пример: возьмите последний идентификатор в таблице towns_users и добавьте к нему 1 миллион.Ваши идентификаторы towns_users будут выглядеть следующим образом: 1000001, 1000002, 1000003

И, наконец, вы вставите сгенерированный идентификатор towns_users в таблицу пользователей.

Наличие отдельной таблицы для пользовательских вводов должно помочь вам сохранитьочистка базы данных:

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

Как @Joakim упомянул в комментарии, с точки зрения БД, поскольку towns_id - это внешний ключ, ссылающийся на таблицу городов, вставка записи в пользовательскую таблицу завершится неудачно, если соответствующего города еще нет в таблице.

С точки зрения программирования, если вы хотите, чтобы город, которого нет в таблице, сначала вставлялся автоматически при каждой регистрации пользователя, это возможно.Предполагая, что вы используете Java и Hibernate, а сущность User содержит сущность City, вызов метода saveOrUpdate () для сущности user приведет к вставке записи города, если она еще не существует, и запись пользователя будет вставлена ​​в таблицу User.

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