Mysql 维护价格表每天都在变化
状态(st\U id,st\U名称)Mysql 维护价格表每天都在变化,mysql,database,database-design,Mysql,Database,Database Design,状态(st\U id,st\U名称) 地区(d_id、d_名称、st_id[FK]) 产品(pid、pnme) 价格(最高价格、最低价格、pid[FK]、d\U id[FK]) 1.)这是我的表格结构,我想显示5个州及其地区的产品价格,但在价格tbl中,我重复了每个地区的产品(超过10个) 我的价格tbl有什么问题,你能给我一个正常化的想法吗 2.)现在我正计划在价格tbl中添加日期戳(开始日期)字段,这样我就可以维护历史价目表,但如何在每个日期都不重复产品(如下图所示)的情况下做到这一点..
地区(d_id、d_名称、st_id[FK])
产品(pid、pnme)
价格(最高价格、最低价格、pid[FK]、d\U id[FK]) 1.)这是我的表格结构,我想显示5个州及其地区的产品价格,但在价格tbl中,我重复了每个地区的产品(超过10个) 我的价格tbl有什么问题,你能给我一个正常化的想法吗 2.)现在我正计划在价格tbl中添加日期戳(开始日期)字段,这样我就可以维护历史价目表,但如何在每个日期都不重复产品(如下图所示)的情况下做到这一点..有没有更好的解决方案来减少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
1) 在您的价格(价格范围)表中,我不明白为什么(d_id,pid)会重复?除非在表中设置了“生效日期”列,否则应该只有一个价格范围
2) 您可以有一个未来价格表、一个当前价格表和一个历史价格表。这允许您提前输入价格变化,保持当前价格表的简短,并允许您在需要时不经常获取历史价格。应用程序代码维护这些价格表之间的关系
我不确定city在您的其他价格表中来自何处,因为您定义了州和地区。1)您的表设计没有太大问题-但是,示例数据没有意义,因为产品1和地区111重复出现。您可能希望在pid和d_id上创建一个复合主键
2) 再说一次,桌子的设计没什么问题;如果有更改,您可能只考虑输入数据,以便检索给定日期的价格,以查找所需数据之前的最后记录。这减少了桌子的大小
一般要点:请选择一个命名约定并坚持它-您使用pid和d_id(一个带下划线,一个不带下划线);一般来说,我更喜欢描述性的列名,但一致性是关键
此外,只要数据不是冗余的,大型表也没有问题。您的设计似乎没有冗余
1.)这是我的表结构,我想在5中显示产品的价格
州及其地区,但在价格tbl中,我重复产品(超过10个)
为每个地区
如果您在所有这些地区提供所有产品,并且价格根据产品在哪个地区销售而有所不同,那么您在每个地区重复该产品才有意义
我的价格tbl有什么问题,你能给我一个正常化的想法吗
看起来您的价格表没有合理的主键
如果你是沿着这些线做桌子的
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表格。但是您的示例数据可能无法放入其中。粘贴到SQL DDL中,以使您的结构和约束非常清晰。我认为它已规范化。N说的是桌子的宽度,而不是桌子的长度。我喜欢你的薄桌子。(而且,规范化是老生常谈,没有必要的。)在我的价格tbl中,不同地区的产品价格不同,所以我重复d_id(地区id)和pid(产品id)。。。我的表格中需要做哪些更改您的价格范围表格中d_id和pid的组合必须是唯一的。每个商品、每个地区都有一个价格范围。是的!命名约定。比什么都重要。@Rudie:从数据库中得到正确答案肯定比什么都重要。获得正确答案与约束有关。它与命名约定无关。@MikeSherrill在命名约定之后加上“Catcall”,这是最重要的。命名约定很容易满足,它们应该总是排在列表的首位。实现的容易程度并不决定重要性。