我有一个关于如何为这种用例构建数据库的问题:
我有用户&每个用户都有几个我无法预测的元数据(然后无法放入列中)。
例如:
User1有country = Fr和site = Paris User2具有country = GB和site = London,但is_manager = true
事实上,元数据计数可能会有所不同,然后我考虑使用这样的架构:
但我不知道如何使用元数据country = Fr&提取用户site =巴黎。 我知道的唯一方法是通过执行请求,然后使用Python来完成我在SQL中无法做的事情,这是痛苦的:
SELECT *
FROM user_has_metadata UHM
JOIN user U
ON UHM.user_id = U.id
JOIN metadata M
ON UHM.metadata_id = M.id
WHERE UHM.value = "Fr" OR UHM.value = "Paris"
但这还不够,我必须在此之后处理数据。还有更好的方法吗?
非常感谢。
答案 0 :(得分:0)
您计划的架构可以满足您的需求。 SELECT可以是:
SELECT *
FROM user U
WHERE EXISTS
(
SELECT 1
FROM user_has_metadata UHM
WHERE
U.id=UHM.user_id
AND UHM.value = "Fr"
)
AND EXISTS
(
SELECT 1
FROM user_has_metadata UHM2
WHERE
U.id=UHM2.user_id
AND UHM2.value = "Paris"
)
顺便说一句,我建议在表USER中将“id”重命名为“user_id”,该名称应反映该字段包含的内容,并且应在所有表中调用相同的名称。与metadata_id相同。 此外,最好比较metadata_id值,而不是“值”,因为不同的元数据类型可能相同。