我们希望在我们的应用程序中开发一个需要支持不同实体(如用户,项目,文件夹,文档等)的自定义属性的应用程序。
我用google搜索并初步看到它看起来像No-SQL数据库可以适合我们的要求。你看到有什么限制吗?使用No-SQL而不是RDBMS的原则/缺点是什么?
有许多NO-SQL数据库可用 - http://nosql-database.org/?但我们没有任何使用No SQL数据库的经验。没有找到任何比较这些NO-SQL数据库的好文章。我们可以使用No-SQL数据存储来实现自定义属性功能的任何建议吗?
答案 0 :(得分:1)
No-sql数据库的一大优势是它的自由风格:在插入真实数据之前,你永远不会指定像“user,project,folder”这样的列。可以随时添加列。
在RDBMS中,表模式是严格定义的,在运行时不能修改。
另一个优点是查询性能。如果你查询用户的所有记录,比如“迈克尔”,这是非常有效的,因为数据是按照谷歌命名的大表原则存储的。
答案 1 :(得分:0)
有两种方法可以解决您的问题:像Cassandra这样的列数据库;或关系中的名称 - 值对(也称为属性 - 值对)。
首先,Cassandra是一个结构化的键值存储。键可以包含多个和变量属性和值。值或列分组为列族。创建Cassandra数据库时,列系列已得到修复。系列类似于逻辑数据模型中的实体或关系中的表。可以随时将列添加到族中。因此,列族的不同实例可以具有不同的列,这是您需要的。此外,列被分配给指定的键,因此不同的键在任何给定的族中可以具有不同的列数。
名称值对(也称为属性值对)可以在逻辑数据建模中创建,也可以在关系中创建。这可以通过三个相关的实体或表来完成:
“类型”实体只是一个由类型代码标识并包含描述和其他域特征的代码表。域指的是数据类型,长度,含义和度量单位。它描述了脱离上下文的属性(即未分配)。一个例子可能是净值金额,它是带有2位小数的数字8位数,右对齐,其描述是“表示客户总财务价值的值,包括液体和非液体金额”。
“value”实体是由客户ID和属性类型代码标识的关联实体或表,并且具有value属性,该属性为Customer分配Net Worth Amount类型并为其赋予值,例如“ $ 2,000,000。”
但是,在关系中,名称 - 值对在SQL中查询有点困难,而且通常效果不佳。这可以通过将“类型”和“值”实体非规范化为一个来解决。而不是有三个表,你有两个 - 一对多。实际上,这实际上就是卡桑德拉的表现。列族是完全展平的属性 - 值对。
我希望这会有所帮助。如果您打算使用NOSQL,我会使用像Cassandra这样的东西。如果你使用关系,我会对类型和值进行非规范化(即,崩溃为一个)。关系的优点是你已经拥有它。 Cassandra的缺点在于你必须学习它,但它是为了做你想做的事情。
答案 2 :(得分:0)
Couchbase对你来说是一个很好的答案,如果你可以将你的模型封装到JSON中,那么你已经在那里了。您可以为对象提供任意数量的属性:
产物:: 001 { “名字”:“硬盘”, “品牌”:“东芝”, ... ... }
要了解从RDBMS迁移到Couchbase的一些简单模式,请查看他们在http://www.couchbase.com/webinars的网络研讨会或http://CouchbaseModels.com处的一些简单设计模式(虽然示例在Ruby中)
Couchbase的真正优势在于架构灵活性,商用硬件的水平可扩展性和速度。在学习了基础知识之后,它更适合敏捷流程,几乎不需要迁移。在企业组织中,它非常有效,因为每个列修改都需要DBA的业务流程和批准。 Couchbase架构灵活性可以解决许多这些问题。