2011-01-08 3 views
0

Моя текущая база данных состоит из следующих таблиц.Вопрос о конкретной задаче на базу данных

магазин пользователей рейтинги заданных вопросов -

user(uid(varchar), qid(varchar), rating(varchar), primary key(uid, qid)) 

магазин вопрос и его ID -

questions(uid(varchar), question(text), primary key(qid)) 

магазин отношения, что вопросы имеют между собой -

related(qid(varchar), related_qid(varchar), relation(varchar), primary key(qid, related_qid, relation)) 

Каждый вопрос связан, по крайней мере, с одним другим вопросом; например, вопрос 1 и вопрос2 могут быть связаны с тем, что ожидается, что средний рейтинг вопроса1 будет больше, чем вопрос2. Эта зависимость будет храниться в "соответствующей" таблицы, как

вставить в смежных (QID, related_qid, отношение) значений (1, 2, GT)
где 'GT' означает "больше чем".

Проблема в том, что кодирование отношений не кажется совсем элегантным. У кого-то есть лучшее решение?

+0

Что такое отношение (varchar)? Это характер отношений, выраженный как комментарий? Тип отношения? EDIT: Хорошо, я вижу, что это код или сокращенное правило. – Tim

+0

@ Тим, да. – dnbwise

ответ

1

Я бы изменил типы столбцов. Я думаю, что qid и related_qid были бы лучше всего целыми для быстрых соединений, а related можно было бы изменить на тип перечисления, если он доступен в вашей базе данных (например, MySQL имеет ENUM).

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

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

Кроме этих пунктов, это кажется разумным дизайном.

+0

Что касается первичного ключа с двумя столбцами, я намерен предотвратить множественные рейтинги для одного и того же пользователя и вопрос. Например, после вставки uid = 1, qid = 1, rating = 1 нельзя вставить uid = 1, qid = 1, rating = 2. Разве это не хороший подход? – dnbwise

+0

@dnbwise: Звучит нормально, но тогда я должен задать вопрос о вашем выборе имени таблицы. Возможно, вместо этого 'user_rating'? –

+0

вы сделали несколько полезных моментов. Я думаю, что проблема, которая у меня есть, - для меня - это предполагает потенциальную избыточность в связанной таблице. Таким образом, говоря qid = 1, related_qid = 2, отношение = gt, я также говорю qid = 2, related_qid = 1, отношение = lt - но требуется только одна из строк. По сути, мне нужны только два соотношения gt и eq. Итак, может быть, для ENUM лучше иметь значения (gt, eq), чем (gt, eq, lt)? – dnbwise

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