Sql 如何正确安排这种模式?

Sql 如何正确安排这种模式?,sql,database,sqlite,normalization,Sql,Database,Sqlite,Normalization,我想让用户能够创建他们想要的任何度量,并随时间记录它的值。除此之外的唯一行动是能够查看选定指标/时间范围的数据趋势 我的表格结构如下: Table: Metric Fields: id int prim key, name text Table: MetricPoint Fields: id int prim key, metric_id int (foreign key to Metric.id), value real, timestamp long 这是正确的方法吗?还是应该为添加的每

我想让用户能够创建他们想要的任何度量,并随时间记录它的值。除此之外的唯一行动是能够查看选定指标/时间范围的数据趋势

我的表格结构如下:

Table: Metric
Fields: id int prim key, name text

Table: MetricPoint
Fields: id int prim key, metric_id int (foreign key to Metric.id), value real, timestamp long
这是正确的方法吗?还是应该为添加的每个度量动态创建新表?还是让他们成为专栏


我被告知当前的安排很糟糕,因为它使用了实体-属性-值建模,这显然被认为是一种反模式:

不要为每个指标创建新表。不要为新指标添加新列。你的方法似乎是正确的

当您可以输入新数据而不必重新设计/创建新对象时,您就走上了正确的道路


关于EAV:当您不知道模式是什么时,或多或少会出现这种情况,因此您尝试构建一个能够覆盖可能需要覆盖的任何内容的模式。这是一场噩梦,不应该真的被使用。在您的例子中,您确切地知道模式是什么(metric,metric属性),但不知道值是什么,这是非常好的。

有人提到我构建它的方式是不正确的,因为它是一个反模式,名为。。。我似乎再也找不到了。EAX表格?编辑:EAV表单,这是一个标准的1:M关系,根据您对需要跟踪的内容的描述,它是完全正确的。问谁告诉你详细的解释,然后发回到这里,我们可以告诉你为什么他们是不正确的(真的,这是基本的,因为它得到)好的,只是看看你的链接。。。我是这么说的,但那只是我。我会按照你在问题中描述的方式来做,就像我认识的绝大多数有能力的数据库开发人员一样。我需要添加任何额外的索引来加快速度吗?我猜不会,因为我想外键会自动被索引,但我只是问一下。也许时间戳是唯一的?为了澄清,您所建议的不是EAV模型。允许用户描述他们自己的度量标准并不是在EAV的上下文中-对于最常用的1:M关系,您拥有的是一个非常基本、非常常见的场景。EAV完全是另外一种东西,在这里并不重要。