2009-11-11 5 views
0

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

Я не знаю, нужна ли нормализация, но я хочу делать все отлично, и я не знаю, хорошо ли это или нет.

Я использовал PhpMyAdmin создать свою базу данных ...

фона: Im сделать веб-сайт объявлений. Одна категория объявлений - «автомобили». До сих пор я создал базу данных для только автомобилей, я думал, что это может быть хорошо, чтобы начать с автомобилями просто ...

Вот таблица: (только один стол)

  1. идентификатор (AI) (INT (7))
  2. area_id (VARCHAR (30))
  3. area_community (VARCHAR (30))
  4. цена (INT (9))
  5. год (INT (4))
  6. мили (INT (6))
  7. коробки передач (УАКСНАК (12))
  8. топлива (УАКСНАК (12))
  9. insert_date (ТШЕЗТАМР)
  10. poster_name (УАКСНАК (30))
  11. poster_email (УАКСНАК (30))
  12. poster_tel (УАКСНАК (20))
  13. poster_password (УАКСНАК (15))
  14. poster_zip (INT (5))
  15. private_or_company (INT (2))
  16. заголовок (VARCHAR (60))
  17. описание (ТЕКСТ)
  18. sell_or_buy (INT (2))
  19. nr_of_pics (INT (2))

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

Спасибо большое!

ОБНОВЛЕНИЕ ОК, поэтому расщепление сделки здесь ... Итак, скажем, я разделил плакат на отдельный стол. Как связать «poster_table» с первой таблицей? То есть, если пользователь нажимает на объявление, а затем объявление должно быть отображено, вдоль имени бокового плаката, даты, области и т. Д. И т. Д. Итак, должен быть способ связать их, правильно?

+1

Да. Вы просто добавляете так называемый «внешний ключ». В таблице «плакаты» будет столбец «integer auto_increment» с именем «id», который вы укажете в качестве первичного ключа. Это даст каждой строке таблицы «плакаты» уникальное значение в этой ячейке. Затем в таблице «cars» вы получите поле «poster_id». В этом поле вы будете записывать значение ячейки «id» для строки в таблице «плакаты», к которой вы хотите привязать. –

+0

Когда вы выбираете строку из таблицы «cars», вы можете посмотреть поле «poster_id» и выбрать соответствующую строку из таблицы «плакаты». Это можно сделать в одной инструкции SELECT с помощью JOIN. –

+0

Оператор SELECT, вы имеете в виду php, когда я запрашиваю мою базу данных? Я начинаю получать его сейчас, пожалуйста, объясните еще ... Я получаю PK и FK, но не знаю, как указать из одного поля таблицы в другое значение полей таблицы ... – 2009-11-11 12:43:36

ответ

0

Я бы посоветовал выяснить все функции, которые вам нужны, а затем начать планирование БД. В противном случае прямо сейчас стол в порядке - пока он только для автомобилей. Если вам понадобятся другие типы предметов, это будет недостаточно, и вам придется либо делать больше таблиц (по одному для каждого типа предметов), либо выполнять большую нормализацию.

Добавлено: На первый взгляд вам нужно переместить плакаты на отдельную таблицу, потому что они похожи на пользователей с паролями и т. Д. Если вы не хотите, чтобы человек сделал новый логин для каждой записи, вы должны иметь его в отдельной таблице. В противном случае происходит то, что происходит, когда человек меняет свой пароль - вы должны изменить его во всех строках таблицы! Это довольно неудобно и неэффективно. Основная идея - каждый кусочек данных должен храниться только в одном месте. Если для изменения одной части данных вам необходимо обновить несколько копий этих данных, вы должны переместить ее в другую таблицу и сделать внешние ключи.

Добавлено 2: С другой стороны - может быть, вы не хотите, чтобы ваши пользователи делали отдельный вход? Возможно, они просто публикуют свои объявления и устанавливают пароль для каждого из них (а затем используют пароль для редактирования определенного элемента)? В этом случае вы не должны разделять две таблицы. Если у вас есть две таблицы, в которых записи идут 1: 1 (как и в, для каждой строки в первой таблице не больше и не менее 1 строки во второй таблице), тогда таблицы должны быть объединены.

-1

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

Кроме этого - какие повторения? коробка передач и топливо также являются кандидатами на нормализацию.

0

Любопытное расплывчатым, но, как минимум, вы должны иметь следующие таблицы:

items - corresponding to any item in the classified 
users - person either buying or selling 
addresses - any address 
images - holds an item image 
item_features - hold item specific info like engine, model, etc for a car 
+0

Если вы решите пойти этим путем, я также добавлю таблицы «item_types», «item_type_features», «item_type_feature_valid_values» (в случае, если какая-либо функция является выпадающим списком). И item_type_features могут иметь LOT различных ограничений на них (длина, мин/макс, раскрывающийся список, целое число/double/date/text/boolean, проверка регулярного выражения, некоторый пользовательский механизм и т. Д.) –

0

Некоторые комментарии:

Сплит из области, и плакат для разделения таблиц.

Я бы использовал тип даты, а не временную метку для insert_date. (Но это зависит от того, как вы его используете.)

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

Ваша ширина для имен и адресов электронной почты также слишком мала.

0

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

  1. Категория
  2. Ad
  3. продавца (то, что вы называете 'Плакат')
  4. Площадь
  5. Изображения

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

Удачи вам!

0

Хорошо:

  1. Поля 10 до 15 (имея делать с плакатом) перейти в отдельную таблицу.Добавьте первичный ключ с именем PosterID в эту таблицу и замените поля с 10 по 15 полем PosterID в качестве внешнего ключа обратно на таблицу плакатов.

  2. Сделайте то же самое для полей 2 & 3, считая, что area_community является описанием area_id. Также подумайте, является ли область собственностью плаката или отдельной рекламы.

  3. Поля с 5 по 8 проблематичны, потому что они делают этот стол одним для автомобилей, а не только для рекламы. Я бы либо: A) разделил это на две таблицы (Ad и Ad_Cars) или (лучше) B) создать таблицы категорий, CategoryProperties и AdProperties. Категории перечисляют вещи, такие как автомобиль, мебель и т. Д. CategoryProperties перечисляет свойства, которые могут или должны иметь каждая категория ({car, miles}, {car, gearing}, {car, make}). Наконец, AdProperties заполняется путем выбора нужного набора свойств из CategoryProperties, привязки их к объявлению (по идентификатору) и ввода пользователем значений ({1, мили, 10000}, {1, передача, руководство}).

  4. Не знаете, как вы обрабатываете изображения, но я, вероятно, рекламирую таблицу AdPictures, содержащую AdID и PictureFileName. Я бы избавился от nr_of_pictures и вместо этого получал эту информацию из представления GROUP BY на AdPictures, если это не вызывает проблемы с производительностью.

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