0

州 (st_id,st_name)
区 (d_id,d_name,st_id[FK])
产品 (pid,pnme)
价格 (max_price,min_price,pid[FK],d_id[FK])

在此处输入图像描述

1.)这是我的表格结构,我想显示 5 个州及其地区的产品价格,但在价格表中,我为每个地区重复产品(超过 10 个)。

我的价格有什么问题,您能否给出一个使其正常化的想法..

2.)现在我正计划在价格表中添加日期戳(开始日期)字段,以便我可以维护历史价格表,但是我如何在每个日期不重复产品(如下所示)的情况下做到这一点..任何减少 tbl 行的更好解决方案

_______________________________________
product| price |district|date(mm/dd/yy)| 
_______|_______|________|______________|
fan      200   delhi    3/15/2013
speaker  400   delhi    3/15/2013
fan      210   chenni   3/15/2013
speaker  403   chenni   3/15/2013
fan      200   delhi    3/16/2013
fan      210   chenni   3/16/2013
4

3 回答 3

1

1) 您的表设计没有什么问题 - 但是,示例数据没有意义,因为产品 1 和 111 区有重复。您可能希望在 pid 和 d_id 上创建复合主键。

2)同样,桌子设计没什么问题;您可能会考虑仅在发生更改时输入数据,以便检索给定日期的价格会搜索所需数据之前的最后一条记录。这减小了表的大小。

一般要点:请选择一个命名约定并遵守它 - 您使用 pid 和 d_id(一个带下划线,一个不带下划线);一般来说,我更喜欢描述性更强的列名,但一致性是关键。

此外,只要数据不是冗余的,大表也没有问题。您的设计似乎没有冗余。

于 2013-03-15T16:30:10.247 回答
1

1.)这是我的表格结构,我想显示 5 个州及其地区的产品价格,但在价格表中,我为每个地区重复产品(超过 10 个)。

如果您在所有这些地区提供所有产品,并且价格取决于产品在哪个地区销售,那么只有在每个地区重复该产品才有意义。

我的价格有什么问题,您能否给出一个使其正常化的想法..

看起来您的价格表没有合理的主键。

如果您按照这些思路构建表格。. .

create table prices (
  district_id integer not null references districts (district_id),
  product_id integer not null references products (product_id),
  primary key (district_id, product_id),
  min_price numeric(14,2) not null,
  max_price numeric(14,2) not null
);

假设最低和最高产品价格因地区而异,您将在 5NF 中获得一张表。但是你的样本数据不可能适合它。

于 2013-03-15T16:36:09.523 回答
0

1)在您的价格(价格范围)表中,我不明白为什么 (d_id, pid) 重复?应该只有一个价格范围,除非您在表格中添加了生效日期列。

2) 你可以有一个未来价格表、一个当前价格表和一个历史价格表。这允许您提前输入价格变化,保持当前价格表简短,并允许您在需要时不频繁地获取历史价格。您的应用程序代码维护这些价格表之间的关系。

由于您定义了州和地区,因此我不确定您的其他价格表中的城市来自哪里。

于 2013-03-15T16:17:36.727 回答