Мой последний MySQL DB, кто-то может проверить, правильно ли составлены таблицы? - PullRequest
0 голосов
/ 20 января 2010

У меня есть эти таблицы:

category table:
cat_id (PK)
cat_name

category_options table:
option_id (PK)
cat_id (FK)
option_name

option_values table:
value_id (PK)
option_id (FK)
value

classifieds table:
ad_id (PK) (VARCHAR) something like "Bmw330ci_28238239832"
poster_id (FK)
cat_id (FK)
headline
description
price
etc....

posters table:
poster_id (PK)
name 
email
tel
password
etc....

Три основных вопроса:
1- Выше достаточно хорошо? Это покрывает все мои потребности по крайней мере ...

2- Иногда, когда я пробую разные запросы, я получаю странные результаты ... Не могли бы вы написать строку запроса PHP, которая будет извлекать одно полное объявление только из ad_id? (представьте, единственная переменная, которая у вас есть, это ad_id)

3- В строке запроса я должен указать все разные таблицы, которые связаны для показа рекламы? Разве я не могу просто использовать что-то вроде «SELECT * FROM ads WHERE ad_id = $ ad_id», и оно будет обрабатывать ссылки автоматически, то есть получать всю связанную информацию?

Спасибо, и если вам нужно больше информации, дайте мне знать!

Ответы [ 2 ]

2 голосов
/ 20 января 2010

У вас серьезные проблемы с дизайном. Никогда не используйте имя в качестве PK; оно не уникально и может быть изменено! Например, женщины меняют свои имена, когда вступают в брак. На самом деле, вообще не используйте varchars в качестве PKS. Вместо этого используйте суррогатные ключи. Суррогатные ключи не меняются, значения текстовых ключей часто меняются, и они тоже медленнее.

И никогда не храните имя как одно поле, это плохая практика. Как минимум, вам нужно имя, фамилия, отчество и суффикс. Вам также понадобится автоинкрементное поле идентификатора, чтобы Джон Смит по одному адресу в Чикаго мог находиться в таблице вместе с другим Джоном Смитом, который живет в другом месте в Чикаго.

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

Не используйте неявные объединения при добавлении других таблиц в свои запросы. Они устарели на 18 лет. Учитесь правильно, используя явные объединения.

1 голос
/ 20 января 2010

1) Если это отвечает вашим потребностям, то не сделает ли это его «достаточно хорошим»? Если серьезно, я бы согласился с davek, что вы должны сделать поле ad_id int / bigint, и я бы также предложил то же самое для таблицы posters. Сделайте имя регулярным значением и создайте для него поле PK autonum int / bigint. Если по какой-либо причине пользователь хочет изменить свое имя (возможно, из-за соображений конфиденциальности), вам также придется обновить любые внешние ключи в базе данных. С автономным ключом у вас не будет этой проблемы.

2) Да, из того, что я вижу, вы сможете собрать все данные в объявлении, зная только ad_id.

3) Нет, вам нужно сделать что-то большее: либо равное соединение в запросе SELECT, либо использование ключевого слова JOIN для извлечения ваших данных. MySQL не имеет модели мета-отношений (например, MS Access), поэтому он не будет автоматически понимать ваши отношения первичного / внешнего ключа.

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