我有一個關於通用數據庫結構的SQL相關問題,似乎有點常見。有一天,我試圖解決一個問題,並且(後來)我看到其他人做同樣的事情(或者非常相似的事情),所以我認爲結構本身是有意義的。我試圖對它進行某些查詢時遇到困難。如何在SQL數據庫中使用行作爲字段
這個想法是,你已經有一個表中的「項目」,並且你想存儲一組字段及其每個項目的值。通常這可以通過簡單地向列表添加列來完成,問題在於字段本身(而不僅僅是值)隨着項目的不同而不同。例如,我可能有兩個項目:
條
的product_id = aproductid
hidden_key = ahiddenkeyvalue
第2條
的product_id = anotherproductid
地址= anaddress
您可以看到這兩個項目都有一個product_id字段(具有不同的值),但是爲每個項目存儲的數據是不同的。
在數據庫中的結構最終是這樣的:
ItemsTable
ID
itemdata_1
itemdata_2
...
FieldsTable
ID
FIELD_NAME
...
這涉及他們,使得它的工作
FieldsItemRelationsTable
FIELD_ID
ITEM_ID表
值
那麼,當我試圖做一些只涉及一個「動態字段」值的東西時,就沒有問題了。我通常做類似的東西:
SELECT i.* FROM ItemsTable i
INNER JOIN FieldsItemRelationsTable v ON v.item_id = i.id
INNER JOIN FieldsTable f ON f.id = v.field_id
WHERE v.value = 50 AND f.name = 'product_id';
它選擇的所有項目,其中的product_id = 50
,當我需要做的,涉及多個「動力場」的價值觀的東西,就會出現問題。假設我想選擇product_id = 50和hidden_key = 30的所有項目。是否可以使用單個SQL語句?我試過了:
SELECT i.* FROM ItemsTable i
INNER JOIN FieldsItemRelationsTable v ON v.item_id = i.id
INNER JOIN FieldsTable f ON f.id = v.field_id
WHERE (v.value = 50 AND f.name = 'product_id')
AND (v.value = 30 AND f.name = 'hidden_key');
但它只是返回零行。
我添加了'eav'標籤。該設計被稱爲實體屬性值。 – 2011-07-22 18:56:50