为什么 magento 跨属性类型存储 EAV 数据?
Why magento store EAV data across attribute type?
在 magento 系统中,有 5 个 table 用于跨属性类型存储 EAV 数据。这样做是一个有效的性能选择吗?当我进行 sql 查询时,我仍然需要使用 UNION 子句来获取整个数据集。如果我使用一个混合 table 来存储 EAV 数据,根据唯一的一种数据类型(varchar,或 sql_variant in sql server2008),我以后会遇到什么性能问题?
Is it an effective performance choice to do it?
Magento 开发人员选择使用 EAV 结构,因为它在大量数据下表现良好。扁平 table 结构对于小型设置来说是 suitable,但随着它的扩展,它变得越来越低效。
When I make a sql query, I still need to use UNION clause to get the whole data set.
您应该在所有可能的情况下尝试避免在 Magento 数据库上直接 SQL 查询。他们具有可用于安装新数据的设置模型,其中您可以使用已经存在的 Magento 模型和设置模型必须 create/modify Magento 核心配置数据或变量的方法,或者使用底层Zend framework 的 ORM 如果你需要创建新的 tables 等
特别是就数据库的 EAV 部分而言,如果从 SQL 的角度对其进行攻击,它的设置方式会很复杂,这就是存在 Magento 模型的原因,以便它可以全部包裹在 PHP ORM 中。同样,如果可以,请避免 SQL 查询。
如果您有进行直接查询,您将不会创建 UNION 查询,而是加入那些 tables,并且您将使用 eav_attribute
table 作为支点 table 为您提供 attribute_id
(主键)和值将存在于其中的来源 table。
通过使用直接 SQL 查询,您还失去了 Magento 实施的后备系统,其中可以存在商店或网站级别的值,如果您在商店级别。如果您想使用 SQL 手动执行此操作,那么查询会变得更加复杂,因为您需要查找这些值,如果找不到,则恢复为默认(全局范围)值。
If I use one mixed table to store EAV data according by the only one data type(varchar, or sql_variant in sql server2008), what will I encounter performance issue in future?
如前所述,这取决于您的数据库的预期规模。您会注意到,在标准的 Magento 数据库中有很多扁平的 tables,并且 EAV 结构仅适用于 Magento 开发人员认为可能会大幅增加数量的部分(客户、目录等)。
如果您想实现自定义模块,并且您认为它也有可能随着时间的推移快速增长,那么您可以为它实现自己的 EAV table。 Magento 模型脚手架支持这一点,网上有大量关于如何设置它们的资源。
如果您的 table 可能保持(相对)较小,那么一定要采用平坦的 table 方法。如果它是一个自定义模块并且您注意到快速增长,您可以随时在它成为瓶颈之前转换它。
在 magento 系统中,有 5 个 table 用于跨属性类型存储 EAV 数据。这样做是一个有效的性能选择吗?当我进行 sql 查询时,我仍然需要使用 UNION 子句来获取整个数据集。如果我使用一个混合 table 来存储 EAV 数据,根据唯一的一种数据类型(varchar,或 sql_variant in sql server2008),我以后会遇到什么性能问题?
Is it an effective performance choice to do it?
Magento 开发人员选择使用 EAV 结构,因为它在大量数据下表现良好。扁平 table 结构对于小型设置来说是 suitable,但随着它的扩展,它变得越来越低效。
When I make a sql query, I still need to use UNION clause to get the whole data set.
您应该在所有可能的情况下尝试避免在 Magento 数据库上直接 SQL 查询。他们具有可用于安装新数据的设置模型,其中您可以使用已经存在的 Magento 模型和设置模型必须 create/modify Magento 核心配置数据或变量的方法,或者使用底层Zend framework 的 ORM 如果你需要创建新的 tables 等
特别是就数据库的 EAV 部分而言,如果从 SQL 的角度对其进行攻击,它的设置方式会很复杂,这就是存在 Magento 模型的原因,以便它可以全部包裹在 PHP ORM 中。同样,如果可以,请避免 SQL 查询。
如果您有进行直接查询,您将不会创建 UNION 查询,而是加入那些 tables,并且您将使用 eav_attribute
table 作为支点 table 为您提供 attribute_id
(主键)和值将存在于其中的来源 table。
通过使用直接 SQL 查询,您还失去了 Magento 实施的后备系统,其中可以存在商店或网站级别的值,如果您在商店级别。如果您想使用 SQL 手动执行此操作,那么查询会变得更加复杂,因为您需要查找这些值,如果找不到,则恢复为默认(全局范围)值。
If I use one mixed table to store EAV data according by the only one data type(varchar, or sql_variant in sql server2008), what will I encounter performance issue in future?
如前所述,这取决于您的数据库的预期规模。您会注意到,在标准的 Magento 数据库中有很多扁平的 tables,并且 EAV 结构仅适用于 Magento 开发人员认为可能会大幅增加数量的部分(客户、目录等)。
如果您想实现自定义模块,并且您认为它也有可能随着时间的推移快速增长,那么您可以为它实现自己的 EAV table。 Magento 模型脚手架支持这一点,网上有大量关于如何设置它们的资源。
如果您的 table 可能保持(相对)较小,那么一定要采用平坦的 table 方法。如果它是一个自定义模块并且您注意到快速增长,您可以随时在它成为瓶颈之前转换它。