我正在寻找一种在我的数据库中拥有变量列的方法(可能是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中做到这一点!
答案 0 :(得分:0)
您正在实施一种称为实体 - 属性 - 值(EAV)模型的东西。你已经很好地描述了它,以防你不知道它是什么。
就数据结构而言,字符串类型在具有NULL
值时占用的空间很小。但是其他类型占据空间,所以你会浪费空间。您可以将所有内容存储为字符串 - 数字作为数字,日期作为YYYY-MM-DD,并使用单个字符串。但是,您确实失去了本机数据类型的一些灵活性。
通常,EAV模型的计算成本很高。每月600 MB是一个可观的数据量。通过数GB的数据将记录重新组合在一起可能会让MySQL感到痛苦(group by
的性能很差)。我通常推荐一种混合型EAV模型,其中有一个常规的"记录存储常用属性和EAV片段仅用于不常见的属性。