【问题标题】:Is Database Normalized Enough/Properly?数据库规范化是否足够/正确?
【发布时间】:2014-07-29 16:11:00
【问题描述】:

我的数据库中有一些非常丑陋的表,所以我回去尝试对其进行规范化。我不确定这是否足够或做得正确,如果有任何关于如何改进我的数据库设置的建议,我将不胜感激。

我已经在 SQLFiddle 设置了它:http://sqlfiddle.com/#!2/7ac6a1

【问题讨论】:

  • 是的,它似乎“足够规范化”,但是您在某些表上缺少 PK,并且您在其他表(存在自然键)上提供了代理 PK。这些在任何其他表格中都没有引用,因此(在我看来)它们是多余的。
  • 你指的是哪个?我知道像 dragon_to_habitat、boosts 和 dragon_elements 这样的表没有 PK,因为它们从其他表中获取 PK。你觉得哪个是多余的?
  • RDBMS 中的所有表都需要主键。这是基本的(1NF)。在链接表上,PRIMARY KEY 可以由与其他表的 FOREIGN KEY 组合而成。
  • @Strawberry 关系理论中没有主键。 PK 是选择的一些候选键(又名键)......称为“主键”。候选键很重要。它们是最小的超级键。超级键是具有唯一值的列。 SQL 中的哪个是通过 UNIQUE 或 PK 声明定义的唯一性。所以实际上一个 SQL“PK”列集甚至不一定是一个键。但是每个表都至少有一个键,并且应该声明它的键。
  • @philipxy 太好了。我的观点很简单,RDBMS 中的所有表都应该包含一种机制,用于唯一标识每一行。无论它在技术上是否精确,我认为我们都可以同意,在通常的说法中,这被称为 PRIMARY KEY。

标签: mysql database normalization


【解决方案1】:

我已经为缺少的表添加了 PK,将两个字段组合为 PK。

CREATE TABLE IF NOT EXISTS `boosts` (
  `habitat_list_id` int(10) NOT NULL,
  `element_id` int(5) NOT NULL,
  PRIMARY KEY  (`habitat_list_id`,`element_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

【讨论】:

    猜你喜欢
    • 2011-10-01
    • 1970-01-01
    • 2013-12-25
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多