Сохранение роста и веса пользователя - PullRequest
6 голосов
/ 06 июля 2011

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

Моя идея - хранить информацию о росте в сантиметрах и весе в килограммах (я предпочитаю метрическую, а не английскую). Я даже могу позволить пользователю вводить свою информацию и английскую систему, но перед сохранением выполнить преобразование в метрическую систему. Я думаю, что преобразование килограммов в фунты может быть легко сделать в SQL, но я не уверен, насколько легко было бы преобразовать 178 сантиметра в 5'10" (слегка округленный вниз).

Должен ли я сохранять английские и метрические значения в базе данных, чтобы мне не нужно было выполнять преобразования при выполнении моих запросов? Похоже, плохая идея хранить производные / вычисленные значения.

Ответы [ 4 ]

6 голосов
/ 06 июля 2011

Есть несколько способов ... один состоит в том, чтобы просто иметь два числовых столбца, один для роста, другой для веса, а затем выполнить преобразования (при необходимости) во время отображения.Другой способ - создать таблицу «высота» и таблицу «вес», каждая из которых имеет первичный ключ, связанный с другой таблицей.Затем вы можете сохранить в этих таблицах как английские, так и метрические значения (вместе с любой другой метаинформацией):

CREATE TABLE height (
    id          SERIAL PRIMARY KEY,
    english     VARCHAR,
    inches      INT,
    cm          INT,
    hands       INT  // As in, the height of a horse
);

INSERT INTO height VALUES
    (1,'4 feet',           48, 122, 12),
    (2,'4 feet, 1 inch',   49, 124, 12),
    (3,'4 feet, 2 inches', 50, 127, 12),
    (3,'4 feet, 3 inches', 51, 130, 12),
    ....

Вы поймете, что ...

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

CREATE TABLE users (
    uid         SERIAL PRIMARY KEY,
    height      INT REFERENCES height(id),
    weight      INT references weight(id),
    sign        INT references sign(id),
    ...
);

Затем выполнить поискдля пользователей от 4 до 5 футов:

SELECT *
FROM users
JOIN height ON users.height = height.id
WHERE height.inches >= 48 AND height.inches <= 60;

Несколько преимуществ этого метода:

  • Вам не нужно дублировать «усилие» (как если бы оно было реальным).работать), чтобы сделать преобразование на дисплее - просто выберите формат, который вы хотите отобразить!
  • Это делает заполнение выпадающих списков в HTML-выборе очень простым - например, SELECT english FROM height ORDER BY inches.
  • Это делает вашу логику для различных измерений - в том числе нечисловых (например, астрологических знаков) явно схожей - у вас нет кода особого случая повсюду для каждого типа данных.
  • Он очень хорошо масштабируется
  • Это позволяет легко рекламироватьd новые представления ваших данных (например, для добавления столбца 'hands' в таблицу высот)
3 голосов
/ 06 июля 2011

Я бы сделал это так, как вы сказали, что вы хотели бы сделать это, но на конвертирующей части вы бы не конвертировали 178 сантиметров в 5'10 ", вы бы конвертировали в 70", а затем, если потребуется, , преобразовать это в 5'10 ".

1 голос
/ 06 июля 2011

Думайте о 5'10 "как о 70" или 5.8333333 '. В этом случае преобразование между 70 "или 5.83333 - это просто умножение, поэтому его легко сохранить в БД в сантиметрах, если вы того пожелаете.

Проблема того, что видит пользователь, - это проблема презентации и не имеет ничего общего с базой данных.

0 голосов
/ 06 июля 2011

Я согласен, что сохранение вычисленных значений в этом случае не совсем нормально. Ваш выбор идеален.

Однако я хотел бы выполнить вычисления на уровне приложения и запросить БД с этими значениями - в зависимости от языка, на котором написано ваше приложение, я уверен, что существует множество библиотек / модулей, которые могут вычислять эти преобразования. .

Редактировать - для решения проблемы хранения вычисленных значений в БД:

Хотя это считается плохой практикой при работе с БД, я обычно не на 100% против этой практики - только на 90%.

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

Если вы будете хранить вычисленные значения здесь, у вас будут только недостатки этого метода - при изменении записи вам придется изменять данные в нескольких местах, чтобы сохранить согласованность вашей БД

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