2010-04-09 3 views
1

здесь мои 3 таблицы:MySQL Нормализация базы данных вопрос

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

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

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

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

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

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

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

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

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

спасибо.

ответ

3

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

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

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

0

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

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

Так что, если все места были отменить выбор и новый один добавил, что это будет выглядеть так:

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

спасибо, мне нравится и вы, и ответ Мэтью Флашен! – NULL

0

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

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

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

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

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