вопрос нормализации базы данных mysql - PullRequest
1 голос
/ 09 апреля 2010

вот мои 3 таблицы:

таблица 1 - хранит информацию о пользователе и содержит уникальные данные

Таблица 2 - хранит категорию мест, таких как, Торонто, Нью-Йорк, Лондон и т.д., следовательно, это также уникально

Таблица 3 - дубликат информации. он хранит все места, где был пользователь.

3 таблицы связаны или объединены этими идентификаторами:

таблица 1 имеет "table1_id"

таблица 2 имеет "table2_id" и "place_name"

таблица 3 имеет "table3_id", "table1_id", "place_name"

У меня есть интерфейс, где администратор видит всех пользователей. У пользователя есть кнопка «Редактировать». щелкнув по этой кнопке редактирования, вы можете редактировать конкретного пользователя в полях формы, в которых есть несколько раскрывающихся списков для «мест».

если администратор редактирует пользователя и добавляет 1 «места» для пользователя, я вставляю эту информацию, используя php. если администратор решает отменить выбор 1 «места», я могу удалить его или отметить как включенный и выключенный? как насчет того, если администратор решит выбрать 2 «места» для пользователя; поменяйте первые «места» и добавьте дополнительные «места». мой стол будет только расти, и у меня будет только избыточная информация?

спасибо.

Ответы [ 3 ]

3 голосов
/ 09 апреля 2010

Таблицы 1 и 2 звучат правильно. Таблица 3 не должна содержать place_name. Вместо этого у вас должны быть ссылки на внешние ключи как для table1_id, так и для table2_id (вы можете при желании сохранить table3_id). Это делает table3 соединительной таблицей .

Когда вы хотите удалить место для пользователя, вы удалите строку в таблице_3 (и все). При добавлении места вы сначала проверяете, существует ли оно в таблице 1. Если нет, то добавляете его в таблицу 1. Затем добавляете строку в таблицу 3. Изменение (например, переименование места в пользовательском интерфейсе пользователя) разбить на удаление, затем добавить.

Это позволит избежать избыточной информации.

0 голосов
/ 09 апреля 2010

Удаление записей может повлиять на одновременных вставок в MySQL, поэтому наличие столбца включения / выключения вместо DELETE может быть оптимизацией в будущем.

Выможет установить индекс UNIQUE для нескольких столбцов, гарантируя, что для любой данной комбинации человек / местоположение существует только одна запись.Синтаксис INSERT … ON DUPLICATE KEY UPDATE может упростить запросы в этой ситуации, особенно когда местоположение повторно включается после удаления.

При такой настройке вам потребуется некоторый сценарий обслуживания, который запускается каждыйдень / неделя / что угодно, чтобы DELETE "выключить" записи, а затем OPTIMIZE TABLE.

Итак, это один из способов сделать это.

0 голосов
/ 09 апреля 2010

Как вы справитесь с этим, зависит от потребностей вашего приложения. Например, вам нужно знать, когда место было удалено?

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

Итак, если все места были отменены и добавлено новое, это выглядело бы как:

delete from UserPlace where UserID = 42;
insert into UserPlace (UserID, PlaceID) values (42, 123);
...