gpt4 book ai didi

php - EAV 与我的数据的基于列的组织

转载 作者:行者123 更新时间:2023-11-29 14:24:05 26 4
gpt4 key购买 nike

我正在使用 PHP 和 PostgreSQL 重建应用程序(这里是独立开发人员)。对于大多数数据,我使用一个表来存储它,每个属性都有多个列。但是,我现在开始为内容存储构建一些表。在这种情况下,内容是多个部分,每个部分包含不同的数据集;一些数据是通用的和共享的(和外键),而其他数据是非常独特的。在应用程序的当前迭代中,我们有一个像这样的表结构:

id | project_name | project_owner | site | customer_name | last_updated
-----------------------------------------------------------------------
1 | test1 | some guy | 12 | some company | 1/2/2012
2 | test2 | another guy | 04 | another co | 2/22/2012

现在,这可行了 - 但由于某些原因很难维护。添加新列(很少发生)需要修改数据库表。审计/历史跟踪需要一个单独的表来镜像主表和附加信息——如果主表发生变化,也需要修改。最后,有很多列 - 在一些表中超过 100。

我一直在集思广益地想出替代方法,包括将一张大 table 分成许多小 table 。这引入了我认为也会引起问题的其他问题。

我目前正在考虑的方法似乎称为 EAV 模型。我有一个看起来像这样的表:

id | project_name | col_name | data_varchar      | data_int | data_timestamp | update_time
--------------------------------------------------------------------------------------------------
1 | test1 | site | | 12 | | 1/2/2012
2 | test1 | customer_name | some company | | | 1/2/2012
3 | test1 | project_owner | some guy | | | 1/2/2012

……等等。这样做的好处是我从不更新,总是插入。数据永远不会被覆盖,只会被添加。当然,该表最终会变得相当大。我有一个列出项目的“索引”表,用于引用“数据”表。但是,我觉得这种方法遗漏了很多东西。它会扩展吗?我最初想做一个简单的键 -> 值类型表,但意识到我需要能够在表中包含不同的数据类型。这似乎是易于管理的,因为我正在使用的数据库抽象层将包含一种从适当的列中选择数据的类型。

我是否为自己做了太多工作?我应该坚持使用包含大量列的简单表格吗?

最佳答案

我的建议是,如果您可以避免使用 EAV 表,那就这样做吧。他们往往是性能 killer 。它们也很难正确查询,尤其是对于报告(是的,让我加入这个表未知次数以从中获取我需要的所有数据,哦顺便说一下,我不知道我有哪些列可用所以我不知道报告需要包含哪些列)并且很难获得确保数据完整性所需的那种数据库约束(例如如何确保填写必填字段)并且它可能导致你使用错误的数据类型。从长远来看,定义存储所需数据的表要好得多。

如果您确实需要该功能,那么至少要研究针对此类未定义数据进行了更优化的 NoSQL 数据库。

关于php - EAV 与我的数据的基于列的组织,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8918598/

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