如果您的表有question_body 和question_type,那么我看不出将其移至另一个表如何实现规范化。例如:
table question (
question_body text,
question_user text,
question_user_rank integer,
question_type text
);
将单个值拆分为单个列表除了无用的连接之外不会实现任何其他功能。那就是:
select * from question q join question_type qt on (q.qt_id = qt.id)
where qt.name = 'sql questions';
是一个等价的,但浪费的形式
select * from question
where question_type = 'sql questions';
另一方面,(使用上面的示例),将问题用户信息拆分到自己的表中是很有意义的:
table question (
question_body text,
question_type text,
question_user_id integer references question_user(id) on delete cascade
);
table question_user (
id integer,
name text,
rank integer
);
因此,如果用户更改了他的排名(ala SO),您只需在一个地方更改它,而不是在他被问问题的每一行中进行更改。由于您将数百个更新更改为一个更新,因此您提高了处理缩放的能力。