【问题标题】:Is the logic of the table correct?表格的逻辑是否正确?
【发布时间】:2019-07-10 11:30:56
【问题描述】:

我最近遇到了一个结构如下的 SQL 表:

int ID,

INT Id,
NVARCHAR(50) ItemNumber,
INT January,
INT February,
...,
INT December,
INT Year

这个整数列是指定列名月份和年份的销售额。我很感兴趣这个逻辑是否适用于 SQL 表。创建另一个表不是更专业吗,我们可以在其中存储例如月份,并从上一个表中引用该表,例如 monthId,这里还有另一列 Count

【问题讨论】:

  • 是的。一个正确的规范化 能有一个monthid 列和一个值列
  • appears 打破了范式,如果这就是你要问的并且(如果它不是数据仓库)我不确定你为什么需要存储此类数据(例如,已汇总);它可以通过查询您的源表来派生。除非经常更新,否则此类表格往往会“过时”
  • 它到底破坏了哪种范式?
  • 没关系。我以为你在问什么是正常形式。

标签: sql sql-server tsql


【解决方案1】:

我当然希望year 列是针对这一年的,而不是说是针对这一年的总和。

你的直觉是正确的。我倾向于将其简单地构造为:

create table <whatever> as (
    id int identity(1, 1) primary key,
    itemCode nvarchar(50),
    yyyymm date not null,
    amount int  -- amount is an arbitrary name for the value column
);

请注意,我认为 itemNumber 是一个非常糟糕的名称,因为它是一个字符串。

你可以保证每个月有一行:

create table <whatever> as (
    id int identity(1, 1) primary key,
    itemCode nvarchar(50),
    yyyymm date not null,
    amount int,
    constraint chk_whatever_yyyymm (day(yyyymm) = 1),
    constraint unq_whatever_yyyymm_itemcode unique (itemCode, yyyymm)
);

可以使用带有单独查找表的monthid 列。但是,将日期固定为月初的约束意味着月份可以表示为date,直接启用所有日期功能。

【讨论】:

  • “一个主要问题是表格中缺少“年份”列。” 是的,确实如此;这是 OP 表的最后一列;他们将其定义为 "INT Year".
  • @Larnu 。 . .有趣的。我想知道这是一年的总数还是实际上是一年。
  • 有人会希望是后者,但你说得对,它很可能是前者;这是个问题。我认为对此的解释将有助于此处的答案。
  • 是的,这不是总数,而是月份中的年份,例如2018.
猜你喜欢
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多