Mysql 超通用数据库结构

Mysql 超通用数据库结构,mysql,ruby-on-rails,Mysql,Ruby On Rails,假设我有一家商店,销售各种类别的产品。。。每个类别都有相关的属性。。。像钻头一样,可能有涂层、直径、螺旋角等。问题是,我希望用户能够编辑这些属性。如果我对让用户更改属性不感兴趣,并且我正在为一组特定的类别构建存储,我会有一个用于钻取的表,等等。或者,我可以在线修改模式,但这似乎不是经常做的(除非我们讨论的是phpmyadmin或其他内容),此外,这与模型与表的耦合方式完全不符 一般来说,我感兴趣的是在mysql中实现具有各种数据类型的多表数据库结构(因为diameter可能是十进制的,coati

假设我有一家商店,销售各种类别的产品。。。每个类别都有相关的属性。。。像钻头一样,可能有涂层、直径、螺旋角等。问题是,我希望用户能够编辑这些属性。如果我对让用户更改属性不感兴趣,并且我正在为一组特定的类别构建存储,我会有一个用于钻取的表,等等。或者,我可以在线修改模式,但这似乎不是经常做的(除非我们讨论的是phpmyadmin或其他内容),此外,这与模型与表的耦合方式完全不符


一般来说,我感兴趣的是在mysql中实现具有各种数据类型的多表数据库结构(因为diameter可能是十进制的,coating可能是表中的字符串/索引,等等)。你知道怎么做吗?

如果我正确理解你的问题,一个公认的黑客式解决方案是有一个
products
表,该表必须与相关表相关,
product\u properties
product\u properties\u lookup
(或更好的名称)其中
product\u properties\u lookup
product
可以拥有的每个可能的属性都有一个条目,而
product\u properties
将属性的值作为字符串包含属性ID和产品ID。然后可以强制将属性值转换为所需的任何类型。不太理想,但除了为属性类型向DB添加单独的列之外,我不确定还能做什么。

如果我正确理解您的要求,一个公认的黑客解决方案是有一个
products
表,该表必须与相关表、
product\u properties
product\u properties\u lookup
(或者更好的名字)其中
product\u properties\u lookup
product
可以拥有的每个可能属性都有一个条目,而
product\u properties
将属性值作为字符串包含在属性ID和产品ID中。然后,您可以将属性值强制转换为所需的任何类型。这并不理想,但我“除了为属性类型向数据库添加单独的列之外,我不知道还能做什么。

只需使用数据库。它已经完成了所有这一切。免费且快速。让产品表指向具有数据类型的属性表与具有列的属性表有何不同?没有。如果使用要使用的DBs表,请保存。”与您自己的方式相比,SQL可以以各种简洁、高效的方式查询它(交叉表吸收SQL数据库)

获取一个新产品,制作一个新表。没什么大不了的。获取一个新属性,改变表。如果你的表中有100万个产品,是的,这可能是一个缓慢的更新(取决于数据库)。你有100万个产品吗?我不认为沃尔玛有100万个产品


在数据库之上构建数据库是一件愚蠢的事情。只要使用那里的数据库就行了。它是你手中的油灰。随心所欲地塑造它。

只要使用数据库就行了。它已经完成了所有这一切。免费、快速。让产品表指向具有数据类型的属性表与具有列的表有何不同?事实并非如此。如果您使用的是DBs表,则可以使用SQL以各种简洁、高效的方式对其进行查询,而不是使用自己的表(交叉表吸收SQL DBs)

获取一个新产品,制作一个新表。没什么大不了的。获取一个新属性,改变表。如果你的表中有100万个产品,是的,这可能是一个缓慢的更新(取决于数据库)。你有100万个产品吗?我不认为沃尔玛有100万个产品


在数据库之上构建数据库是一件愚蠢的事情。只需使用其中的一个。它在你的手中是油灰。根据你的心血来潮塑造它。

首先创建一个属性表。它将包含所有属性。它至少应该有一个名称列和一个类型列('string','boolean','decimal',等等)。注意:所有这些表都隐含主键

接下来,创建一个CategoryProperty表。在这里,您可以为类别分配属性。它应该有以下列:CategoryID、PropertyID。两个外键

然后,创建一个Category表。该表描述了类别。它应该有一个Name列,可能还有其他一些类似Description的列

然后,创建一个ProductCategory表。在这里,您将为每个产品分配类别。它应该有以下列:CategoryID、ProductID。两个外键

接下来,创建一个PropertyValue表。在这里,您将“实例化”属性并为它们赋值。列包括ProductID、PropertyID和PropertyValue。主键可以由ProductID和PropertyID组成

最后,创建一个产品表,该表仅用名称、价格等列描述每个产品

请注意,每个关系都有一个单独的表。如果您只希望每个产品有一个类别,则可以取消ProductCategory表,只在product表中放置CategoryID字段。类似地,如果您希望每个属性只属于一个类别,则可以在category表中放置PropertyID列,并去掉t他把财产分类表


最后,您将无法验证每个属性的数据类型,因为每个属性都有不同的类型(它们是行,而不是列)。因此,只需将PropertyValue列设置为字符串,然后作为触发器执行验证,或者在应用程序中,通过检查属性表中该属性的Type列来执行验证。

首先创建一个属性表。该表将包含所有属性。它应该(至少)具有名称列和类型列('string'、'boolean'、'decimal'等)。注意:所有这些表都隐含主键

接下来是cr
SELECT SUM( EXTRACTVALUE( infoxml, '/info/widget_count/text()' ) ) as widget_count 
  WHERE product_type="widgetpack"
<info>
  <widget_count>10</widget_count>
  <!-- Any other unstructured info can go in here too -->
</info>