Foriegn Keys Yah或Nah

时间:2017-01-15 13:30:44

标签: php mysql sql database foreign-keys

非F-K SCHEMA

human
  human_id | name

alien
  alien_id | name | planet

comment 
  comment_id | text 
        1         hello

vote

  to_id | to_type   |  who  | who_type
  1     human     1       alien
  1     comment   1       human

FK-SCHEMA

human
  human_id | name

alien
  alien_id | name | planet

comment 
  comment_id | text 
        1         hello

entity_id 
  entity_id | id  | type
        1     1      human
        2     1     comment
        3     1     alien      

vote

  to_id | who_id
   1       3     
   2       1

我想问哪一个更好?

第一个没有外键

第二个是外键

不是第二个(用fk键)会很慢,因为我必须做两次插入和不必要的连接以获得人/外星人的名字等。

如果entity_id达到18446744073709551615的最大值,会发生什么?

1 个答案:

答案 0 :(得分:2)

我建议你添加一个超类型来统一HumanAlien并在关系中使用这个超类型。我还建议将对用户投票的评论投票分成单独的关系。请考虑以下表格:

Voting table diagram

这是基本的想法,虽然有点过于简单。它允许用户同时拥有人员和外国人的详细信息。如果需要,可以使用一些额外的列和触发器强制执行不相交的子类型。

你问外键和连接是否会变慢。可以认为规范化数据库可能更有效,因为消除了冗余关联。实际上,与有效使用索引相比,性能与避免连接有很大关系。

如果auto_increment列溢出,则数据库引擎将返回错误并拒绝插入更多行。在这种情况下,您可以调整列以使用更大的类型。当你超过MySQL中最大类型的空间时,可能需要一个不同的(甚至是自定义的)解决方案。