【问题标题】:Database Normalization and User Defined Data Storage数据库规范化和用户定义的数据存储
【发布时间】:2012-07-01 16:58:25
【问题描述】:

我希望让我的 Web 应用程序的用户定义他们自己的产品属性,然后为这些产品输入数据。我发现这种技术叫做n(th) normal form

以下是我目前正在考虑部署的数据库结构,我想知道在完整性和可扩展性(以及您能想到的任何其他 -ity 方面)的正面和负面影响是什么

编辑 (对不起,我是这个意思)

过去 15 分钟我一直盯着这个,我知道(红色箭头所在的位置)会导致重复,因此您必须进行完整性检查。但是我只是不明白我想要的其他方法可以做什么。

产品的编号不会超过 10。变量的编号不会超过 200(每个产品最多 20 个)。产品实例的数量不会超过 100,000,因此 pVariable_data 的最大大小不会超过 200 万

【问题讨论】:

  • 如果我正确理解您的帖子,这就是所谓的 EAV(实体、属性、值)类型的数据模型。你的问题到底是什么?
  • 你可能有一点。我有一种怪异的感觉,我正走在一条破旧的路上
  • 如果属性集是可变的并且取决于被描述对象的类型,则EAV模型适用。 (汽车有颜色;发动机没有颜色)
  • 一个给定的产品也会有多个模块吗?
  • 约翰:你是什么意思?你的意思是我必须有任何many-2-many 关系吗?

标签: database django postgresql database-design


【解决方案1】:

这个模型被称为数据库中的数据库,并不好。虽然有时不可能首先检查您是否真的需要它,并且您的数据库确实是适合这项工作的数据库。

使用 PostgreSQL,您可以使用:http://www.postgresql.org/docs/8.4/static/hstore.html,这是针对此类问题的标准化解决方案。

【讨论】:

  • 谢谢,我会调查hstore的东西
  • 这很酷,我不知道 postgres 有这个。取决于用于与数据库交互的工具包,但如果您需要交换数据库实现,这可能会导致更多问题(如果此应用程序使用静态类型语言,则映射它的难度也很大)
  • 我同意。我必须实现github.com/jordanm/django-hstore,但我不知道查找时会是什么样子
【解决方案2】:

假设 pVariable 更多的是 pVariable 类型,请删除对 product_fk 的引用。这意味着您需要在该表中为每个产品记录创建一个新条目。也许尝试这样的事情:

Product(id, active, allow_new)

pVariable_type(id, name) 

pVariable_data(id, product_fk, pvariable_fk, non_typed_value, bool, int, etc)

我会使用 non_typed_value 作为您的文本值,并且(除非您保留流)将记录与键入的值一起写入该字段。这意味着将记录的值保留两次(并且在更新等方面更加痛苦),但它会使查询和报告(您只需要显示值的任何内容)更容易。

注意:将所有产品共有的任何东西都拉出来并将它们放在产品表中也是一种想法。例如,所有产品很可能都有名称、建议价格等。

【讨论】:

  • 所以您的意思是将non-typed_value 作为快速查找列。嗯……有趣。这不会影响单一类型变量查询的速度,但会加快跨变量查询是吗?
  • 是的,例如,如果您需要做一些报告或在网页中显示多个产品(您只是报告并且类型无关紧要),那么查询产品会容易得多不必担心每个字段都得到正确的类型
  • 这是否显着减少了数据库命中(由于类型转换和比较操作)以保证实施? (即我没有这个功能,我真的不需要它,但我可能会实现它,因为用户可能需要它)
  • 它应该可以为您不必要地获取输入数据的情况节省时间
猜你喜欢
  • 2013-06-09
  • 1970-01-01
  • 2011-10-07
  • 2021-10-27
  • 2014-06-07
  • 1970-01-01
  • 2013-11-10
  • 2012-10-08
相关资源
最近更新 更多