Mysql: как структурировать эти данные и искать их - PullRequest
0 голосов
/ 06 июля 2011

Я новичок в MySQL.Прямо сейчас у меня есть такая структура в базе данных mysql:

| keyID | Param           | Value
| 123   | Location        | Canada
| 123   | Cost            | 34
| 123   | TransportMethod | Boat
 ...
 ...

У меня, вероятно, около 20 параметров с уникальными значениями для каждого идентификатора ключа.Я хочу иметь возможность искать в mysql по 20 параметрам с каждым из значений и выяснять, какой keyID.

Во-первых, как мне вообще реструктурировать базу данных mysql?Должен ли я иметь 20 столбцов param + keyID?Во-вторых, (относится к первому вопросу), как мне выполнить запрос, чтобы найти идентификатор ключа?

Ответы [ 3 ]

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

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

|keyID|Location|Cost|TransportMethod|...|...
|123  |Canada  |34  |Boat ...
|124  | ...
 ...

Затем, чтобы запросить идентификатор ключа, вы должны использовать операторы SELECT, FROM и WHERE, например,

SELECT keyID
FROM key_table 
WHERE Location='Canada'
AND Cost=34
AND TransportMethod='Boat'
...

для получения дополнительной информации см. http://www.w3schools.com/php/php_mysql_where.asp

edit: если ваши параметры меняются для разных объектов (keyID), это потребует другого подхода, я думаю

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

Показанный вами дизайн называется Entity-Attribute-Value. Он нарушает многие правила проектирования реляционных баз данных, и его очень сложно использовать с SQL.

В реляционной базе данных у вас должен быть отдельный столбец для каждого типа атрибута.

CREATE TABLE MyTable (
  keyID           SERIAL PRIMARY KEY,
  Location        VARCHAR(20),
  Cost            NUMERIC(9,2),
  TransportMethod VARCHAR(10)
);
0 голосов
/ 06 июля 2011

Я согласен с тем, что ответ Ника, вероятно, лучший, но если вы действительно хотите сохранить формат ключа / значения, вы можете достичь желаемого с помощью представления (это в синтаксисе PostgreSQL, потому что это то, чтоЯ знаком с, но концепция MySQL та же самая):

CREATE OR REPLACE VIEW myview AS
SELECT keyID,
    MAX(CASE WHEN Param = 'Location' THEN Value END) AS Location,
    MAX(CASE WHEN Param = 'Cost' THEN Value END) AS Cost,
    ....
FROM mytable;

Производительность здесь, вероятно, будет неутешительной, но если ваши запросы не часты, это может выполнить работу.

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