我有两个表,他们的行有一对一关系.. 为了了解这种情况,假设有一个表包含用户信息 还有另一个表包含非常具体的信息,每个用户只能链接到这些特定类型的信息(假设第二个表为字符)
该角色只能分配给抓取它的用户,是否违反设计干净数据库的规则来保存两个表中的关系键?
用户表:user_id,name,age,character_id
字符表:character_id,shape,user_id
我必须为表现而做,你怎么看待它?
答案 0 :(得分:6)
在1:1的关系中,仍然应该有一个被视为“父母”的记录。
在这种情况下,我会将用户视为分层次地位于字符之上,因此只能使用character
表中的外键。
答案 1 :(得分:2)
是的,我认为这违反了设计干净数据库的规则,因为您重复的 数据 ,因此您必须 始终主动维护两组数据 ,以免它们不同步。如果不这样做,则无法信任数据。 :)
作为旁注:你说出于性能原因,你这样做了吗?你看到这样做有什么好处?无论您从哪个表访问数据,您应该找到(使用适当的索引),差异很小?可能是你在这里修正了错误的问题,也许还有其他事情要先看(比如索引,改进你的查询等)。
编辑:选择免费字符应该非常简单,因为您可以从users表中删除character_id
,并且只在字符1中包含user_id
:
Users: user_id, name, age
Characters: character_id, shape, user_id
然后你就可以做一些像这样的查询:
//something like this to query for free characters.
SELECT * FROM characters WHERE user_id IS NULL;
// To access a list of a users characters, you could do something like this:
SELECT * FROM characters WHERE user_id = 42;
// More information about the user, while still grabbing character info.
SELECT * FROM characters AS c INNER JOIN users AS u ON u.user_id = c.user_id WHERE u.user_id = 42;
或者有更多关于你的模型,我可能会错过这个? (因为我不假装知道你的数据库布局;))。我假设一对多的关系,因为它看起来就是这样(一个用户可以有很多字符)。
答案 2 :(得分:2)
有几个原因:
我会查看性能问题的原因,因为这是一个1:1的关系,当你加入PK时,你会很快得到单个记录:FK
答案 3 :(得分:0)
出于性能原因,当然可以分割这样的数据,特别是如果您在很多列中处理大量数据:例如,您可以将“基本”用户信息放在一个表中并详细说明(例如。在另一个中,因为这些不像基本的东西那样经常被访问。也许您需要部分数据的全文功能,因此您可以使用具有不同存储引擎的表。如果ebaghaki出于性能原因需要这样做,我会说它没关系 - 但是,请确保你的应用程序确保密钥的有效性(或使用触发器来保持最新状态?)。
另一种方法是构建一个查找表,它只保存对用户和字符表的引用。那么对于没有选择一个字符或没有用户选择的字符的用户,您的空值不会有任何问题。这可能是你最好的选择,因为你没有因为上述任何原因而拆分表。