Mysql:如何构造这些数据并进行搜索

时间:2011-07-05 23:40:49

标签: mysql entity-attribute-value

我是mysql的新手。现在,我在mysql数据库中有这种结构:

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

我可能有20个参数,每个密钥ID都有唯一的值。我希望能够在mysql中搜索每个值的20个参数,并找出哪个keyID。

首先,我应该如何重构mysql数据库?我应该有20个param列+ keyID吗? 其次,(与第一个问题有关),我如何进行查询以找到keyID?

3 个答案:

答案 0 :(得分:2)

如果你的参数在不同的键之间是相同的(或者所有参数都是对象可能具有的一组参数的子集),你应该构造数据库,使每列都是一个参数,并且该行对应一个KeyID和它的参数值。

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

然后要查询keyID,您将使用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

编辑:如果你的参数在不同的对象(keyIDs)之间发生变化,我认为这需要采用不同的方法

答案 1 :(得分:1)

您展示的设计称为实体 - 属性 - 值。它破坏了关系数据库设计的许多规则,并且很难与SQL一起使用。

在关系数据库中,每个属性类型都应该有一个单独的列。

CREATE TABLE MyTable (
  keyID           SERIAL PRIMARY KEY,
  Location        VARCHAR(20),
  Cost            NUMERIC(9,2),
  TransportMethod VARCHAR(10)
);

答案 2 :(得分:0)

我同意Nick的答案可能是最好的,但是如果你真的希望保留你的键/值格式,你可以用视图完成你想要的东西(这是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;

此处的表现可能很糟糕,但如果您的查询不频繁,则可以完成工作。