【发布时间】:2017-01-03 07:43:54
【问题描述】:
假设我想创建一个这样的表:
id | some_foreign_id | attribute | value
_________________________________________
1 1 Weight 100
2 1 Reps 5
3 2 Reps 40
4 3 Time 10
5 4 Weight 50
6 4 Reps 60
与以这种方式表示的相同数据相比
id | some_foreign_id | weight | reps | time
____________________________________________
1 1 100 5 NULL
2 2 NULL 40 NULL
3 3 NULL NULL 10
4 4 50 60 NULL
因为在这种情况下 id = foreign_id 我认为我们可以将这些列附加到foreign_id 所指的任何表中。
我假设大多数人会绝大多数人说后一种方法是公认的做法。
前一种方法是否被认为是一个坏主意,即使它不会导致任何 NULL 值?这两种方法之间的权衡究竟是什么?似乎前者可能更通用,但代价是没有明确定义的结构,但我不知道这是否真的会导致其他后果。我可以想象在后一个示例中有大量列的情况,其中大部分为 NULL,并且可能只填充了三个不同的值。
【问题讨论】:
-
第一个是使用所谓的实体值属性模型。 en.wikipedia.org/wiki/Entity-attribute-value_model 有人讨厌,有人知道怎么用。在此处研究您的选择。
-
@Twelfth 你会说这两种方法都是合理的吗?如果有很多列,你会使用 EAV 模型吗?查询和连接呢?
-
@Twelfth 我知道它是实体属性值模型,因此是 EAV 的缩写;-)
-
如果您要使用 EAV,请考虑根据数据类型将不同的属性分离到单独的表中。因此,您可能有一个 DECIMAL 类型属性表和另一个 DATE 类型属性表。
-
@Strawberry 我不太明白你的意思。您是说基本上为每一列创建一个新表吗?
标签: mysql sql database sqlite normalization