MySQL数据库结构决策

时间:2012-10-11 21:26:31

标签: mysql overhead-minimization

我正在尝试在为用户提供所有可能的数据之前有一个巨大的表,其中很多不适用于每个用户,然后为用户可以拥有多个数据的单独表(例如,先前的作业)与在多个表之间分配有关每个用户的数据的实例。

第一种方式更精简但我觉得它会使用大量不必要的开销,而第二种方式结果更容易使用,但会导致大量额外的数据库查询。

3 个答案:

答案 0 :(得分:3)

某些关联事物总是的多个实例进入另一个表。此过程称为normalization

虽然乍一看似乎更复杂,但从长远来看,它会让您的生活更轻松。像MySQL这样的数据库系统可以在需要时(如果你的关键字段被正确编入索引),将这些表重新组合在一起(非规范化)。

由于多种原因,使用像你描述的那样的非规范化表格要困难得多。假设Person有多个地址。你怎么把它放到主表? Address1Address2Address3?如果此人有四个不同的地址怎么办?

使用这样的表会变得更加困难,因为在您编写的每个查询中,您现在必须处理表中的三个列而不是一个。

答案 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

如果您愿意,也可以加入用户,但每行都会复制数据,或者您可以使用单独的查询从用户获取数据。我个人会使用第二个查询。