用户可以在其中创建数据类型的数据库

时间:2014-04-04 02:57:07

标签: sql database nosql

我有一个非常老的应用程序使用我需要更新的SQL数据库。我想借此机会改进数据库结构,我将不胜感激。

基本问题是数据库的一个重要部分必须是用户可配置的,而不会触及代码。更具体地说,DB存储产品,并且这些产品具有不同的规格(即列),具体取决于类型。该应用必须能够搜索任何列。只有少数几种类型(约20种),但管理员必须能够在不触及代码的情况下创建新类型。 需要为每个产品存储的数据是字符串或浮点数,每种类型不超过7个。

不是创建用于创建和删除表的接口,而是实现了以下“解决方案”。 - 在产品表中,id有一列; ProducTypeID的一列; 7个字符串列和7个浮点列 - 在ProducType列中,ProducTypeID有一列,14个字符串列指示每个产品类型的7个字符串列和7个浮点列的名称。如果产品不需要这么多列,则列名为NULL

这样可行,但是由于额外的间接对于维护客户端代码非常烦人。

问题是:我应该继续使用SQL DB并添加创建/删除表的方法,还是应该使用noSQL DB?在每种情况下哪些是利弊?

1 个答案:

答案 0 :(得分:1)

请记住,在SQL数据库中,在大型表上添加和删除列可能是一项非常昂贵的操作,可能需要几分钟甚至几小时。在运行中这样做是一个非常糟糕的主意。添加一堆"多用途"列到表是不是更好。查询起来很困难,而且您对产品可以拥有的属性数量有限制。

当每个产品具有0-n动态属性时,通常的书本解决方案是创建第二个表ProductID(primary key) | PropertyName(primary key) | PropertyValue。这允许每个产品具有任意数量的属性。您可以使用主要产品表轻松JOIN来获取所有具有其属性的产品。

当您对切换数据库技术持开放态度时,您还可以使用面向文档的NoSQL数据库,该数据库不使用MongoDB或CouchDB等固定模式。在此类数据库中,集合中的每个文档都可以具有不同的字段集。但在您决定执行此步骤之前,请评估此类数据库如何影响应用程序的其他部分。列出