超级通用数据库结构

时间:2010-07-22 23:13:59

标签: mysql ruby-on-rails

假设我有一家商店销售属于不同类别的产品......并且每个类别都有相关的属性......比如钻头可能有涂层,直径,螺旋角等等。问题是我希望用户能够编辑这些属性。如果我不想让用户更改属性,并且我正在为一组特定类别构建商店,那么我会有一个用于钻头的表,等等。或者,我可以在线修改模式但是似乎没有经常进行(除非我们正在谈论phpmyadmin或其他东西),并且加上它与模型与表格耦合的方式完全不符合。

一般情况下,我有兴趣在mysql中实现具有各种数据类型的多表数据库结构(因为直径可能是小数,涂层将是表中的字符串/索引等)。知道如何做到这一点吗?

6 个答案:

答案 0 :(得分:1)

如果我正确地理解了您的要求,那么,一个公认的hacky解决方案就是拥有一个products表,该表必须与相关表product_propertiesproduct_properties_lookup(或某些表)相关联更好的名称)其中product_properties_lookupproduct可以拥有的每个可能属性都有一个条目,其中product_properties包含属性值作为字符串,其中包含属性的ID和ID产品。然后,您可以将属性值强制转换为您想要的任何类型。不太理想,但我不确定还有什么不能为数据库中的属性类型添加单个列。

答案 1 :(得分:1)

只需使用数据库。它已经做到了这一切。免费。而且很快。如何让产品表指向一个属性表,其数据类型与具有列的表有任何不同?不是。保存,如果使用DBs表,则可以使用SQL以各种简洁有效的方式查询它,与您自己的(SQL dbs中的交叉表相同)进行查询。

获取新产品,制作新表。没什么大不了。获取一个新属性,改变表格。如果该表中有1M个产品,那么,它可能是一个缓慢的更新(取决于数据库)。你有1M产品吗?我不认为WalMart有1M产品。

在数据库之上构建数据库是一件很蠢的事情。只需使用那里的那个。它是腻子在你手中。随心所欲地塑造它。

答案 2 :(得分:1)

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

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

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

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

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

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

注意每个关系如何有一个单独的表。如果您只想为每个产品分配一个类别,则可以取消使用ProductCategory表,只需在Product表中放置一个CategoryID字段即可。同样,如果您希望每个属性只属于一个类别,则可以将PropertyID列放在Category表中,并删除CategoryProperty表。

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

答案 3 :(得分:1)

如果您使用的是最新版本的mysql(5.1.5或更高版本),则可以将数据作为XML存储在数据库中。然后,您可以使用这样的符号查询该数据。

假设我有一个包含一些项目的表,并且我有一个包含许多项目的widgetpack 小部件。我可以得到我的小部件总数:

SELECT SUM( EXTRACTVALUE( infoxml, '/info/widget_count/text()' ) ) as widget_count 
  WHERE product_type="widgetpack"

假设表有一个infoxml列,每个widget包的infxml列包含看起来像这样的XML

<info>
  <widget_count>10</widget_count>
  <!-- Any other unstructured info can go in here too -->
</info>
数据纯粹主义者会对此感到畏缩,这有点像黑客。但通常更容易将所有非结构化数据保存在一个地方。

答案 4 :(得分:0)

答案 5 :(得分:0)