2011-01-24 4 views
1

У меня эта проблема alogirthm, с точки зрения создания таблиц MySQL, позвольте мне объяснить ситуацию:Дилемма с работой со столами?

У меня есть таблица сообщений:

Posts{id, user_id,image,tag,date} 

каждое сообщение может иметь только тег! ТОЛЬКО

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

т.е.

Если бы я хотел, чтобы получить все сообщения с тегом «DOG» Я хотел бы использовать:

select all posts where tag=DOG 

вы думаете, что это неправильно или плохо? Я весьма озадачен!

ответ

3

Если в вашей системе действительно будет только один тег, тогда технически вы можете просто удерживать тег на записи Post. Однако вы не должны: Например, что происходит, когда у вас есть 250000 сообщений о собаках, и решили переименовать тег «Собака» на «Собаку»?

Лучше всего создать таблицу тегов и поместить в нее внешний ключ. Например:

Post{post_id, user_id, image, tag_id, date} 
Tag{tag_id, description} 

Но только в случае, если вы действительно столкнулись, когда-нибудь, со сценарием, в котором сообщение может иметь несколько тегов ...

Тогда вы описываете модель в которые Posts и Tags существуют в так называемом Many-to-Many relationship: данный тег может быть связан с любым количеством сообщений, и данное сообщение может быть связано с любым количеством тегов.

Теперь вам нужна не только отдельная таблица для тегов, но и таблица отношений между ними, которая связывает сообщения с тегами. Например:

Post{post_id, user_id, image, date} 
Tag{tag_id, description} 

Post_Tag{post_id, tag_id} 

Вы бы тогда выбрать все сообщения с тегом «Dog», как так:

SELECT p.* 
FROM Post p 
JOIN Post_Tag pt ON pt.post_id = p.post_id 
JOIN Tag t ON pt.tag_id = t.tag_id 
WHERE t.description = 'Dog' 
+0

Я понимаю ваше высказывание и благодарю вас за ответ, но одно сообщение может быть связано только с одним тегом! yeh спасибо за обновление. теги содержат фактическое EVENT LOL, вы не можете быть на двух разных событиях сразу же! – pingpong

+0

@pingpong Я обновил свой ответ, чтобы включить любой сценарий. Я по-прежнему утверждаю, что вы разделяете теги на свою таблицу, даже если почта может иметь только один.Что произойдет, если вы когда-нибудь решите, что теги должны иметь другую связанную с ними часть данных, например, родительский тег (например, Dogs ниже Pets)? Нормализация для победы. :) –

+0

yeh true thats на самом деле очень верно !!! Я думаю, что создам другую таблицу на самом деле !!! +1 от меня – pingpong

1

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

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