Нормализация базы данных и ввод данных (административный сервер) - PullRequest
0 голосов
/ 04 сентября 2011

Посмотрите на таблицу items ниже, поскольку вы можете видеть, что эта таблица не нормализована. Имя следует в отдельной таблице нормализовать.

mysql> select * from items;
+---------+--------+-----------+------+
| item_id | cat_id | name      | cost |
+---------+--------+-----------+------+
|       1 |    102 | Mushroom  | 5.00 |
|       2 |      2 | Mushroom  | 5.40 |
|       3 |    173 | Pepperoni | 4.00 |
|       4 |    109 | Chips     | 1.00 |
|       5 |     35 | Chips     | 1.00 |
+---------+--------+-----------+------+

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

Если я нормализую эту таблицу примерно так:

mysql> select * from items;
+---------+--------+--------------+------+
| item_id | cat_id | item_name_id | cost |
+---------+--------+--------------+------+
|       1 |    102 |            1 | 5.00 |
|       2 |      2 |            1 | 5.40 |
|       3 |    173 |            2 | 4.00 |
|       4 |    109 |            3 | 1.00 |
|       5 |     35 |            3 | 1.00 |
+---------+--------+--------------+------+
mysql> select * from item_name;
+--------------+-----------+
| item_name_id | name      |
+--------------+-----------+
|            1 | Mushroom  |
|            2 | Pepperoni |
|            3 | Chips     |
+--------------+-----------+

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

Должен быть способ максимально быстро добавить элемент / данные. Какое решение для этого? Я разработал бэкэнд в PHP.

Также, каково решение для редактирования названия элемента? Например, сотрудники могут полностью переименовать название предмета: «Рыбный шашлык» в «Куриный шашлык», и это повлияет на все категории, даже не осознавая этого. Будет некоторая орфографическая ошибка, которую, возможно, потребуется исправить, например, F1sh Kebab, который должен быть Fish Kebab (Это полезно, когда таблицы нормализованы, и я буду видеть, как имя элемента обновляется в каждой категории).

Ответы [ 5 ]

2 голосов
/ 04 сентября 2011

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

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

Что касается того, делать это или нет, это решать вам. Если названия продуктов немного различаются, это проблема? Можно ли исправить такие небольшие проблемы с целостностью данных с помощью пакетных заданий или аналогичных, если они представляют собой проблему?

Решите, как должны выглядеть ваши данные в первую очередь, исходя из дизайна вашей системы. Беспокойство о лучшем способе структурирования пользовательского интерфейса после того, как вы приняли это решение. Как я уже говорил, существуют удобные способы разработки пользовательского интерфейса независимо от структуры данных.

1 голос
/ 04 сентября 2011

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

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

только мои два цента:)

0 голосов
/ 04 сентября 2011

Должен быть способ как можно быстрее добавить элемент / данные.Какое решение для этого?Я разработал бэкэнд на PHP.

Проблемы пользовательского интерфейса и структуры базы данных - это отдельные проблемы.Для данной структуры базы данных обычно существует несколько удобных для пользователя способов представления и изменения данных.Целостность данных исходит из базы данных.Пользовательский интерфейс просто должен знать, где найти уникальные значения.Программист решает, как использовать эти уникальные значения.Вы можете использовать раскрывающийся список, открыть форму поиска, использовать автозаполнение, сравнить, что пользователь вводит с элементами в массиве, или запросить базу данных, чтобы узнать, существует ли уже значение.

Из вашегоописание, похоже, у вас был очень быстрый способ добавления данных: «сотрудники просто выбирают категорию и вводят имя элемента, чтобы быстро добавлять данные».(Замена «гриб» на «1» не имеет ничего общего с нормализацией.)

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

Вы разрешили не тому человеку редактировать названия предметов.Серьезно.

Подобные проблемы возникают в каждом приложении базы данных.Разрешить вносить подобные изменения могут только те, кто обучен и заслуживает доверия.(См. Ваши документы dbms для GRANT и REVOKE. Также посмотрите на ОБНОВЛЕНИЕ ОБНОВЛЕНИЯ.)

В нашей рабочей производственной базе данных я могу вставить новые состояния (для Соединенных Штатов), и я могу изменить существующиеНазовите имена, что я хочу.Но если бы я изменил «Алабаму» на «Кыргызстан», меня бы уволили.Потому что я должен знать лучше, чем делать такие вещи.

Но хотя я и являюсь администратором, я не могу изменить адрес Сан-Франциско и изменить его почтовый индекс на «71601».База данных «знает», что «71601» не является действительным почтовым индексом для Сан-Франциско.Может быть, вы можете добавить таблицу или две к вашей базе данных тоже.Из вашего описания я не могу сказать, поможет ли вам что-то подобное.

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

Будет некоторая орфографическая ошибка, которая может потребоваться исправить, например, F1sh Kebab, который должен быть Fish Kebab

Урок такой же.Некоторые люди должны иметь возможность обновлять items.name, а некоторые - нет.Отмените разрешения, ограничьте каскадные обновления, увеличьте целостность данных, используя больше таблиц, или увеличьте обучение.

0 голосов
/ 04 сентября 2011

Вам необходимо проверить данные и проверить их существование, прежде чем добавлять их, чтобы увидеть, является ли это новым значением.

$value = $_POST['userSubmittedValue']

//make sure you sanitize the variable (never trust user input)

$query = SELECT item_name_id 
         FROM item_name 
         WHERE name='$value';

$result = mysql_query($query);
$row = mysql_fetch_row($result);

if(!empty($row))
{
//add the record with the id from $row['item_name_id'] to items table
}
else
{
//this will be a new value so run queries to add the new value to both items and item_name tables
}
0 голосов
/ 04 сентября 2011

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

Предположительно, определители "name" в первом проекте такие же, как определители "item_name_id" во втором? Если это так, то перемещение имени в другую таблицу не будет иметь никакого значения для нормальных форм, удовлетворяемых вашей таблицей предметов.

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

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