2010-12-09 4 views
2

Я создаю систему для хранения данных стата пользователя следующим образом:MySQL Запрос

 
Table Stats 
=========== 
id name 
----------- 
1  height 
2  weight 
3  eye_colour 
4  etc... 
 
Table Stat_Options 
================== 
id stat_id name 
1  1   170cm 
2  1   172cm 
3  1   174cm 
4  2   60kg 
5  2   65kg 

И я храню идентификаторы stat_options в таблице пользователей следующим образом:

 
Table User_Stats 
================ 
id user_id height weight eye_colour etc... 
--------------------------------------------------------- 
1  10   3   5   7 

Основой для хранения идентификаторов было то, что «имя» stat_option всегда можно изменить, и запись пользователя не требуется изменять.

Но, смотря на это, я думаю, что это может представлять проблему, особенно при поиске. Например, если я хочу искать всех пользователей между двумя конкретными высотами? Одно из решений, которое приходит на ум, - это вставить поле «значение» в таблицу Stat_Options, но я все еще не уверен, что это сработает. Какие-либо предложения?

+0

`SELECT ... FROM STAT_OPTIONS WHERE stat_id = 1 И имя МЕЖДУ x И y` - что с этим сложно? Присоединитесь к таблице STATS, если вам нужно получить stat_id на основе значения имени ... – 2010-12-09 22:12:05

ответ

1

Проблема с этим типом конструкции является то, что вы смешиваете количественные значения (высота, вес) с качественными значениями (eye_colour) в таблице Stat_Options. Если вы этого абсолютно хотите, разделите количественные и качественные значения на 2 столбца.

Table Stat_Options 
================================== 
id stat_id name value unit 
=== ======= ===== ===== ===== 
    1  1 170cm 170  cm 
    2  1 172cm 172  cm 
    3  1 174cm 174  cm 
    4  2 60kg  60  kg 
    5  2 65kg  65  kg 
    6  3 black NULL black 

Тогда, как и другие предложили, JOIN таблицы, чтобы получить значения BETWEEN x AND y.

0

Из вашего примера, вы можете получить все пользователи с высоты между х и у, запрашивая:

Select user_id from User_Stats where User_Status.height between x and y 
+0

За исключением того, что он/она, кажется, сохраняет высоту с включенными единицами. Я согласен, таблица должна быть разбита, по крайней мере, со значением и, возможно, с полем единиц. Оттуда объединение для фильтрации тривиально. – 2010-12-09 22:13:58

1

ИМХО, вы должны использовать таблицу поиска, как ваш Stat_Options только для случаев, когда атрибут имеет конечное количество значений, таких как цвет глаз. Попытка использовать таблицу, подобную этой, для атрибутов, которые (теоретически) имеют бесконечное количество значений, таких как высота и вес, будут, как вы уже догадались, вызывать серьезные головные боли. Я бы сохранил эти значения непосредственно в таблице User_Stats.

+0

В идеале я хочу избежать сохранения значений непосредственно в моей таблице пользователей, я бы скорее просто ссылался на идентификатор и возвращал имя этого выбора из связанной таблицы. Таким образом, я всегда могу обновить имя выбора без необходимости обновлять все записи пользователя с новым именем. – GSTAR 2010-12-09 22:25:52

+0

Хорошо, но в вашем примере высоты вы бы хотели изменить имя в `Stat_Options` с 170 см до 190 см. Вы вдруг измените высоту каждого пользователя, которому был присвоен этот идентификатор, который вам явно не нужен. – 2010-12-09 22:34:49

+0

Это правда, но меня больше беспокоит, если я решила поменять местами между единицами. В зависимости от обратной связи с сайтом я могу решить сохранить высоту в дюймах, а не CM. Таким образом, я хотел иметь гибкость, чтобы я мог переключаться между единицами, не влияя на какие-либо данные пользователя. – GSTAR 2010-12-09 22:54:36

0
SELECT user_id FROM User_Stats WHERE height BETWEEN 170 AND 172; 

Я бы предположил, что один.

Но для структуры таблиц я могу предложить следующее:

  1. Там нет необходимости в таблице статистики, поскольку она может быть включена без проблем внутри таблицы User_Stats. Таким образом, вы лучше нормализовали бы использование таблиц.

  2. IF и только если значения высоты и веса могут быть больше, чем у вас там (например, 180, 183, 192, 200, 110 ...), то я предлагаю то же самое, что и пункт 1. Для отбросить таблицу и включить ее в таблицу User_Stats, поскольку это значение может измениться и на самом деле не нужно создавать новую таблицу только для этого. Таким образом, вы можете выполнять поиск быстрее и легко, сравнивая все, что угодно, в одной таблице.

+0

Нет, потому что высота - это внешний ключ. Никогда не целое число в этом случае. – bAN 2010-12-09 22:18:33

0

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

почему вы не просто добавьте целое поле в таблицу User-stats с высотой?

Но если вы действительно хотите, вы можете сделать:

SELECT * FROM USER_STATS 
INNER JOIN STAT_OPTION 
ON USER_STATS.height in (
SELECT ID FROM Stat_Options 
WHERE NAME BETWEEN 170 AND 175) 

Или что-то подобное, я не обычный с MySql ..

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