gpt4 book ai didi

sql - EAV vs 序列化对象 vs SQL with Xpath?

转载 作者:行者123 更新时间:2023-12-01 00:38:09 24 4
gpt4 key购买 nike

我正在尝试实现徽章系统,徽章基于用户的元数据,这些元数据可能会发生变化。

这些元数据是可变的,并且是动态设置的。

元数据示例:

  • 评论数
  • hasCompletedProfile
  • isActiveMember

等后来,我想添加 hasGravatar 元数据,因此,我无法轻松设计和规范化表格。

虽然这些数据是应用程序的重要组成部分,但它们并不“敏感”,几乎所有这些元数据都可以重新计算,这意味着数据的完整性不是约束的一部分。

目前,我知道三个选项,即使我不知道其中任何一个。

  • EAV
  • 序列化对象
  • XML 字段(我在某处读到可以将 XML 存储在列中,并使用 XPATH 或其他东西来查询数据)

所有这些选项看起来都有利有弊,但由于我从未对它们进行过试验,所以我真的不知道是哪一个。

您有什么意见或建议吗?

我目前在 MySQL 服务器上使用 Zend Framework & Doctrine 2

最佳答案

XML 和序列化对象都非常相似,因为您可能会使用 1 列来存储此任意数据。这很快就会变得非常困惑并且很难在 SQL WHERE 子句中轻松区分(尽管某些 DBMS 具有 XPath 支持)

另一方面,EAV 将为您拥有的每个 Key => Value 对提供单独的行,您可以使用 JOIN 或子查询轻松提取它们。主要缺点是如果您在此处有大量 数据,它可能会影响性能。另一个缺点是为了简单起见,您会将所有键/值作为文本存储在数据库中。您可以为每种类型创建一个 EAV 表,但在大多数语言中实际上并不需要它,因为您获取的内容会以字符串形式出现,或者无论如何都可以在那里进行转换。简单地存储用户配置/属性对于 EAV 来说应该是完美的。

所以您可能有一个包含 3 个字段的 user_metadata 表:

metadata_id INTEGER
user_id INTEGER
key CHAR
value CHAR

然后您可以一次为用户获取所有这些数据:

SELECT * FROM user_metadata WHERE metadata_user_id = $user_id

或者您可以获取个人元数据以及您的用户数据

SELECT user.*, meta_gravatar.value AS hasGravatar
FROM user
LEFT JOIN user_metadata AS meta_gravatar
ON meta_gravatar.user_id = user.user_id AND meta_gravatar.key = 'hasGravatar'
WHERE user.user_id = $user_id

关于sql - EAV vs 序列化对象 vs SQL with Xpath?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5998804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com