【问题标题】:Variant data type in DBDB中的变体数据类型
【发布时间】:2014-10-25 03:39:18
【问题描述】:

我正在寻找一种在我的数据库(可能是 mysql)中有一个变体列的方法,我知道这是不可能的,但我需要的是一种模拟这种行为的方法。

我有一对简单的表格,例如:

#task table
(
id int ..., 
date timestamp, 
owner int
) 

#info table
(
id int ..., 
relative int, #points to Task 
name varchar, 
value VARIANT
)

基本上,我需要将可变数量的信息字段与每个任务相关联,并且每个 information.value 将具有不同的类型(字符串、日期时间、布尔值和整数)。

我计划为每种类型创建四列,而不是单个 VARIANT,并填充正确的列。但是那个表会增长很多(600Mb/月),我认为这将是一个巨大的空间浪费。

有人知道更好的方法来实现这一点吗?

我不知道这是否会让情况变得更糟或更好,但我会在 django 中做到这一点!

【问题讨论】:

  • 每个任务的信息字段数量可变?听起来像一个简单的多对多关系。如果你不知道那是什么,我听说过关于《凡人数据库设计》这本书的好消息。
  • 嗯,不,这是一对多的关系。如果您查看我的问题,您会发现我有可变数量的“信息”行指向“任务”中的单行。这里的交易是有多种数据类型适合单行字段。

标签: mysql sql django


【解决方案1】:

您正在实施一种称为实体属性值 (EAV) 模型的东西。你描述得很好,以防你不知道它是什么。

就数据结构而言,字符串类型在具有NULL 值时占用的空间很小。但其他类型确实占用空间,因此您将浪费空间。您可以将所有内容存储为字符串——数字为数字,日期为 YYYY-MM-DD,并使用单个字符串。但是,您确实失去了本机数据类型的一些灵活性。

一般来说,EAV 模型的计算成本很高。每月 600 MB 是可观的数据量。在 MySQL(group by 的性能很差)中,倾注千兆字节的数据以将记录重新组合在一起可能会很痛苦。我通常推荐混合 EAV 模型,其中“常规”记录存储常用属性,而 EAV 片段仅用于不常用属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2016-04-13
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多