mysql - 数据库数据标准化?

标签 mysql sql database oracle normalization

Here is the data I have to normalize:

//

1NF

客户 ID [名字 (PK)、姓氏 (PK)、电话、地址、城镇、邮政编码、电子邮件]

预订[日期(PK)、房间(PK)、类型、入住人数、天数、抵达时间]

ExtraID [元素名称、元素成本、日期 (FK)、房间 (FK)]

//

名字 + 姓氏 = 复合键

日期 + 房间 = 复合键

//

这样可以吗?

为了进入 2NF,我必须确定部分依赖关系。据我所知,电话、地址、城镇、邮政编码和电子邮件需要复合键的两个部分? 那么这已经在 2NF 中了吗?

谢谢。

最佳答案

使用合成 key 通常是个好主意。这与人有关,尤其是——没有一个自然键真正适合主键目的(我们可能会在这里讨论生物识别技术,但这有点偏离主题)。

因此,需要有一个具有自己的customers_pk 主键的客户表,该主键可以是RDBMS 中的序列,也可以是GUID ( http://en.wikipedia.org/wiki/Globally_unique_identifier )。

应该有一个房间的历史表——价格以及其他房间的特征往往会发生变化。我们可以将房间定义为唯一的物理对象,并决定房间在改造后是否保持不变(这有利有弊,这取决于商业立场)。

我会为附加服务创建一个单独的字典(我们可以在其中使用收据 ID 和 CDR 的引用),然后通过一个表将附加服务与预订链接起来,该表具有自己的主键、预订主键的外键和外键extra 主键的键。

现在,预订表应该有自己的主键,然后是客户的键、房间的键、日期(它们可以是日期类型,或者我们可以创建一个单独的时间维度,在其中我们可以列出各种有用的信息,例如是否高季节或是否有一些本地事件)、居住人数、额外费用总和(好吧,可能不是所有想法中最好的)以及补助金总额。

您可以为每个表的键使用单独的序列,也可以为所有表的键使用一个序列——后者更优雅一些。

关于mysql - 数据库数据标准化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19697158/

相关文章:

SQL查询表达式的优先顺序

sql - 如何将sql查询结果转换为csv格式

java - 该方法没有正确检查该值

sql-server - 将数据类型 numeric 转换为 int 时出错

php - 数据库中的 200 个表太多了吗?

mysql - 为什么我无法将数据插入数据库

java - 使应用程序从MySQL数据库检索数据

mysql - Rails 跳过 ID,可能是数据库 MySQL 事务问题?

mysql - 使用 Ruby 将 mysql 结果导出到文件

PHP/Mysqli 缓存 mysql 主机?不尊重低 TTL