我正在尝试在为用户提供所有可能的数据之前有一个巨大的表,其中很多不适用于每个用户,然后为用户可以拥有多个数据的单独表(例如,先前的作业)与在多个表之间分配有关每个用户的数据的实例。
第一种方式更精简但我觉得它会使用大量不必要的开销,而第二种方式结果更容易使用,但会导致大量额外的数据库查询。
答案 0 :(得分:3)
某些关联事物总是的多个实例进入另一个表。此过程称为normalization。
虽然乍一看似乎更复杂,但从长远来看,它会让您的生活更轻松。像MySQL这样的数据库系统可以在需要时(如果你的关键字段被正确编入索引),将这些表重新组合在一起(非规范化)。
由于多种原因,使用像你描述的那样的非规范化表格要困难得多。假设Person
有多个地址。你怎么把它放到主表? Address1
,Address2
,Address3
?如果此人有四个不同的地址怎么办?
使用这样的表会变得更加困难,因为在您编写的每个查询中,您现在必须处理表中的三个列而不是一个。
答案 1 :(得分:1)
如果相关品质取决于用户类型,并且特定类型的所有用户都具备所有这些品质,则可以为每种类型提供一个表格。
创建表Type1_Qualities( id int not null auto_increment主键, user_id int references(User), qual1 ..., qual2 ..., ... )
,类似于Type2和Type3。这避免了为每个用户提供所有那些无关的字段,但比使用xception的答案等通用属性表进行大量连接更简单。
答案 2 :(得分:0)
根据您的数据存储方式,您可能会选择多个关系数据结构,这只是一个示例:
CREATE TABLE user (
id int not null auto_increment primary key,
name varchar[60] not null
);
CREATE TABLE attributes (
id smallint not null auto_increment primary key,
name varchar[20] not null,
order smallint --optional
);
CREATE TABLE userattributes (
user int not null references user (id),
attribute smallint not null references attributes(id),
value varchar[100] not null,
order tinyint --optional
);
INSERT INTO textattributes(name) VALUES ('alias'), ('address'), ('hobby')
我将订单字段标记为可选,因为您可能不关心那些
SELECT a.name, ua.value
FROM userattributes AS ua
JOIN attributes AS a
ON ua.attribute = a.id
WHERE user = :user
ORDER BY a.order, ua.order
如果您愿意,也可以加入用户,但每行都会复制数据,或者您可以使用单独的查询从用户获取数据。我个人会使用第二个查询。