Database design 如何构造(规范化?)物理参数数据库?

Database design 如何构造(规范化?)物理参数数据库?,database-design,normalization,Database Design,Normalization,我有一个与不同项目相关的物理参数集合。例如: Item, p1, p2, p3 a, 1, 2, 3 b, 4, 5, 6 [...] 其中,px代表参数x 我可以继续存储数据库,完全按照显示的那样;模式将是 CREATE TABLE t1 (item TEXT PRIMARY KEY, p1 FLOAT, p2 FLOAT, p3 FLOAT); 我可以检索语句中所有项的参数p1: SELECT p1 FROM t1; 第二种选择是使用类似以下的模式: CREAT

我有一个与不同项目相关的物理参数集合。例如:

Item, p1, p2, p3
a,     1,  2,  3
b,     4,  5,  6
[...]
其中,
px
代表参数
x

我可以继续存储数据库,完全按照显示的那样;模式将是

CREATE TABLE t1 (item TEXT PRIMARY KEY, p1 FLOAT, p2 FLOAT, p3 FLOAT);
我可以检索语句中所有项的参数
p1

SELECT p1 FROM t1;
第二种选择是使用类似以下的模式:

CREATE TABLE t1 (id INT PRIMARY KEY, item TEXT, par TEXT, val FLOAT)
如果您有许多参数(如我所做的),这似乎要简单得多。但是,参数检索似乎非常棘手:

SELECT val FROM t1 WHERE par == 'p1'
你有什么建议?应该去“枢转”(第一)版本还是<代码> ID,PAR,VAL< /COD>(第二)版本?

非常感谢

编辑

作为参考,我在站点中发现了以下持久性模式(垂直映射):


这是性能与可扩展性之间的权衡。如果您从未打算添加更多的px列,我认为使用第一种方法是安全的,但是,如果您预计将来会有更多的px列,那么您可能希望使用名称/值方法

如果最终得到大量数据,名称-值方法可能会对性能造成不利影响。使用静态列方法可以加快查询速度


您还可以进行混合,从静态列方法开始,添加对键关闭项的“扩展”表的支持,以便将来可以添加其他属性。

这是性能与可扩展性的折衷。如果您从未打算添加更多的px列,我认为使用第一种方法是安全的,但是,如果您预计将来会有更多的px列,那么您可能希望使用名称/值方法

如果最终得到大量数据,名称-值方法可能会对性能造成不利影响。使用静态列方法可以加快查询速度


您还可以进行混合,从静态列方法开始,添加对键关闭项的“扩展”表的支持,以便将来可以添加其他属性。

标准化的方法是按ID将pX值放置在表引用中

ID     Item
1      a 
2      b 
3      c 


ID     Item    P
1      1       1
2      1       2
3      1       3

标准化的方法是将pX值按ID放置在表引用中

ID     Item
1      a 
2      b 
3      c 


ID     Item    P
1      1       1
2      1       2
3      1       3

如果您假设px将超过p4上的三个值(p1、p2和p3),那么第一种方法将失败,继续为p4、p5等添加列似乎是一种有缺陷的方法

老实说,吸引我的方法是将项目和参数分离到不同的表中,然后使用链接实体将它们连接起来:

Item
  |
-----
| | |
ItemParameter

| | |
-----
  |
Parameter
因此,一个项目可以有多个参数,并且一个参数可以存在于多个项目中

因此项目a可以有参数p1、p2和p3

(Item)
a
(ItemParameter)
a p1
a p2
a p2
(Parameter)
p1
p2
p3
或者项目b可以具有参数p1、p2、p6、p10和p19

(Item)
b
(ItemParameter)
b p1
b p2
b p6
b p10
b p19
(Parameter)
p1
p2
p6
p10
p19

依此类推

如果你假设px将增长超过三个值(p1、p2和p3)到p4等等,那么第一种方法将失败,继续为p4、p5等等添加列似乎是一种有缺陷的方法

老实说,吸引我的方法是将项目和参数分离到不同的表中,然后使用链接实体将它们连接起来:

Item
  |
-----
| | |
ItemParameter

| | |
-----
  |
Parameter
因此,一个项目可以有多个参数,并且一个参数可以存在于多个项目中

因此项目a可以有参数p1、p2和p3

(Item)
a
(ItemParameter)
a p1
a p2
a p2
(Parameter)
p1
p2
p3
或者项目b可以具有参数p1、p2、p6、p10和p19

(Item)
b
(ItemParameter)
b p1
b p2
b p6
b p10
b p19
(Parameter)
p1
p2
p6
p10
p19

依此类推

除了第二种方法的灵活性之外,另一个优点是参数可以是参数表中的行,将有关该参数的数据存储为数据库的一部分,而不是模式的列。它还自然地导致数据的RDF三重表示

BTW:不需要添加的键字段,使项和PAR成为联合主键

CREATE TABLE t1 ( item TEXT, par TEXT, val FLOAT, PRIMARY KEY (item, par))
第二种方法的一个限制是,对于所有参数,值的数据类型必须相同-如果所有浮点值都是OK,但为了通用性,这可能必须是字符串,伴随着验证的丢失和编程数据转换的需要

查询速度将受到影响,但您可以通过以下查询获取术语的所有参数:

SELECT par,value FROM t1 WHERE item='qitem'

转换为表示格式比另一种更容易。

除了第二种方法的灵活性外,另一个优点是参数可以是参数表中的行,将有关该参数的数据存储为数据库的一部分,而不是模式的列。它还自然地导致数据的RDF三重表示

BTW:不需要添加的键字段,使项和PAR成为联合主键

CREATE TABLE t1 ( item TEXT, par TEXT, val FLOAT, PRIMARY KEY (item, par))
第二种方法的一个限制是,对于所有参数,值的数据类型必须相同-如果所有浮点值都是OK,但为了通用性,这可能必须是字符串,伴随着验证的丢失和编程数据转换的需要

查询速度将受到影响,但您可以通过以下查询获取术语的所有参数:

SELECT par,value FROM t1 WHERE item='qitem'

这比另一种更容易转换为演示格式。

是的,因此这是一种折衷。如果他们想要更好的性能,有时你必须去规范化。是的,所以这是一个权衡。如果他们想要更好的性能,有时你必须去规范化。你对主键的定义将非常有用。谢谢。您对主键的定义将非常有用。谢谢