非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
的最大值,会发生什么?
答案 0 :(得分:2)
我建议你添加一个超类型来统一Human
和Alien
并在关系中使用这个超类型。我还建议将对用户投票的评论投票分成单独的关系。请考虑以下表格:
这是基本的想法,虽然有点过于简单。它允许用户同时拥有人员和外国人的详细信息。如果需要,可以使用一些额外的列和触发器强制执行不相交的子类型。
你问外键和连接是否会变慢。可以认为规范化数据库可能更有效,因为消除了冗余关联。实际上,与有效使用索引相比,性能与避免连接有很大关系。
如果auto_increment列溢出,则数据库引擎将返回错误并拒绝插入更多行。在这种情况下,您可以调整列以使用更大的类型。当你超过MySQL中最大类型的空间时,可能需要一个不同的(甚至是自定义的)解决方案。