嗯,这可能是您缺少 2 个逻辑步骤来实现这一点。
您需要的是一个 AttributeTypes 表和一个 AttributeValues 表。
objects
id (integer)
name (string)
attribute_types
id (integer)
name (string)
description (string)
enabled (bit)
attribute_values
id (integer)
attribute_type_id (integer)
value (string)
enabled (bit)
attributes
id (integer)
object_id (integer)
attribute_type_id (integer)
attribute_value_id (integer)
所以一个对象可以有属性,这些属性由attribute_type_id 和attribute_value_id 指定。
然后,这允许您拥有一个具有多个属性的对象..
例如
object
-> 1, ball
attribute_types
-> 10, Colour, null, enabled
-> 20, Shape, null, enabled
-> 30, Material, null, enabled
attribute_values
-> 100, 10, blue, enabled
-> 200, 10, red, enabled
-> 300, 10, green, enabled
-> 400, 20, round, enabled
-> 500, 20, square, enabled
-> 600, 20, triangle, enabled
所以一个属性看起来像:
attributes
-> 1000, 1, 10, 100 // this item has a color and it is blue
-> 1001, 1, 20, 400 // this item has a shape and it is round
-> 1002, 1, 10, 200 // this item has a color and it is red
所以现在对象可以有多个属性,这些属性在不同的表中指定它们的值。现在重要的问题是如何查询这个?您可能必须将查询拆分为多个部分,具体取决于您的 sql 的强度。
@attribute_type_id = select Id from attribute_types where name = 'Color' // 10
select * from objects
inner join attributes on objects.id = attributes.object_id
inner join attribute_values on objects.attribute_value_id = attribute_values.id
where attribute_type_id = @attribute_type_id
and attribute_values.value= 'blue'
有了它,您应该带回每个具有颜色属性类型和蓝色属性值的对象。
My Sql 不是那么强大,但如果您想一次搜索多个属性,您应该能够执行多个子句。在我看来,attributes table 中的 attribute_type_id 没有加入 attribute_type 表,但它可以方便在 1 次命中中进行查询,虽然我拥有它,但性能明智,因此它可以通过不必加入来加速查询表,但根据所有内容的大小,差异可能可以忽略不计。
注意:我通常使用 msssql 而不是 mysql,所以如果数据库类型不匹配,这就是原因。