ER_NON_UNIQ_ERROR以及如何正确设计表

时间:2019-06-04 20:29:31

标签: mysql database-design

我遇到了这个问题,现在已经尝试解决了几天。

假设我有以下表格

属性

-----------------------------------------
|  id  |  address  |  building_material |
-----------------------------------------
|   1  |  Street 1 |         1          |
-----------------------------------------
|   2  |  Street 2 |         2          |
-----------------------------------------

building_materials

-----------------------------
|  id  |  building_material |
-----------------------------
|   1  |        Wood        |
-----------------------------
|   2  |       Stone        |
-----------------------------

现在。我想提供一个API,您可以在其中发送请求并询问具有木材建筑材料的每个属性。像这样:

myapi.com/properties?building_material=Wood

所以我想这样查询数据库(我想返回building_material的字符串值而不是数字值):

SELECT p.id, p.address, bm.building_material 
FROM properties as p 
JOIN building_materials as bm ON (p.building_material = bm.id) 
WHERE building_material = "Wood"

但这会给我一个错误

where子句中模棱两可的列“ building_material”

另外,如果我想获取ID为1的属性。

SELECT p.id, p.address, bm.building_material 
FROM properties as p 
JOIN building_materials as bm ON (p.building_material = bm.id) 
WHERE id = 1

where子句中的列“ id”不明确

我知道该错误意味着我在两个表中具有相同的列名,并且没有像p.id那样指定我想要的ID。

问题是我不知道API用户将发送多少个查询参数,我想避免循环浏览它们并将 id 更改为 p.id building_material bm.building_material 。另外,我不希望该用户像这样向API发送请求

myapi.com/properties?bm.building_material=Wood

我已经考虑过将属性表 building_material 更改为 fk_building_material 并将属性表 id 更改为 property_id

我只是不喜欢这样的想法,即在客户端,我必须将房地产的建筑材料称为fk_building_material。这是解决此问题的有效方法,还是设计这些表的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

该查询提到了两个表,因此两个表中的所有列都在“表上”,可在查询中的任何地方使用。

在一个表中,building_material是用于链接到另一个表的“ id”;在另一个表中,它是一个字符串。尽管这是可能的,但是这会使读者感到困惑。并解析器。要解决这种混乱,您必须使building_material符合您的要求;这是通过在前面使用表别名(或表)来完成的(就像您在所有其他地方所做的一样)。

有两个ids都是模棱两可的。但这是表设计人员使用的“惯例”。因此,一个表中的id与另一表中的id不同是可以的。 (p.id指一个表中的一件事; bm.id指另一表中的另一件事。)

SELECT p.id, p.address, bm.building_material 
    FROM properties as p 
    JOIN building_materials as bm ON (p.building_material = bm.id)
    WHERE bm.building_material = "Wood"  -- Note "bm."