我不熟悉使用关系数据库,并且对如何查询和连接表有充分的理解。我今天的问题是一个2部分的问题,因为我真的不知道如何用它来表达它。
例如,通常我会将以下所有列组合到一个表中,然后查询所有数据,即使只使用几列也是如此。我目前正在尝试使用以下数据库结构,这些表将通过uid
列进行链接。 :
上传
uploads_exif(除了uid之外的所有内容都是可选的)
uploads_social(除了uid之外的所有内容都是可选的)
UID
任何帮助都会非常有用,谢谢!
答案 0 :(得分:2)
首先,您应该尝试学习Third Normal Form。
列数不是主要因素,重要的是尽量避免重复,以便维护变得更容易。
例如,如果你有一个表
employee: [id, first_name, last_name]
你不需要把它分成两个表,好吧这是极端但你明白了。
employee_first: [id, first_name]
employee_last: [id, last_name]
另一种情况是避免重复数据。
如果您有一个字段favorite_fruit
而不是使用文本字段,则可以创建一个fk表并保存整数。
favorite_fruit favorite_fruit id fruit
orange 1 1 orange
orange 1 2 apple
apple ==> 2 3 pineapple
pineapple 3
节省空间并且易于编辑,例如,如果您希望将orage
更改为orange juice
,则只需要替换一个。
不确定你的情况是什么,但是例如,如果你有不同类型的upload
,你可以拥有一个upload
的主表type_id
,每个类型可以有一个单独的表细节。
UPLOAD | table: [UPLOAD TYPE1]
upload_id type_id | upload_id [fields unique for type1]
xxxx 1 ==> | xxxxx ooooooo
yyyy 2 |=====================================
| table: [UPLOAD TYPE2]
| upload_id [fields unique for type2]
| yyyyy oooooooo
另一个例子是员工地址。
无需为building, street, zip code
添加多个字段,即可创建三个表
employee: employee_id
adress: address_id, building, street, zip code
employee_adress: employee_id, adress_id.
这样一个员工可以拥有多个地址,只需添加一个单独的实体address
并使用employee
分配给employee_adress
答案 1 :(得分:1)
"列的分组和#34;有很多答案。你的问题指出了两个案例;我认为它们很有启发性:
uploads_exif
-
uploads
)。所以,第一个倾向是说"不要分裂",但...... id
,因为uid
是唯一的,它可以是PRIMARY KEY
。 (这将使JOIN
更有效率。) uploads_social
-
uploads
)。所以,第一个倾向是说"不要分裂",但...... SET
。 (并把它放在主表中。)更改为
CREATE TABLE uploads_social (
uid ...,
which ENUM('facebook', 'twitter', ...),
url ...,
PRIMARY KEY(uid, which)
) ENGINE=InnoDB;
(旁白)正常化时,不要过度正常化。不要标准化日期,花车或其他连续的'值。
为什么id
中同时包含uid
和uploads
? 可能你应该摆脱id
并将uid
提升为PRIMARY KEY
。