我想为一个文件存储未知成员数(介于0到5000之间)的数据。就像Instagram为用户的朋友所做的那样。
到现在为止,我存储了9个成员,为此,我创建了单独的列。通过这样做,我可以连接不同的表。
CREATE TABLE file (
file_id INT NOT NULL AUTO_INCREMENT,
file_name VARCHAR(50) NOT NULL,
file_admin INT NOT NULL,
member1 INT,
member2 INT,
member3 INT,
member4 INT,
member5 INT,
member6 INT,
member7 INT,
member8 INT,
member9 INT,
PRIMARY KEY (file_id),
FOREIGN KEY (file_admin) REFERENCES users(user_id),
FOREIGN KEY (member1) REFERENCES users(user_id),
FOREIGN KEY (member2) REFERENCES users(user_id),
FOREIGN KEY (member3) REFERENCES users(user_id),
FOREIGN KEY (member4) REFERENCES users(user_id),
FOREIGN KEY (member5) REFERENCES users(user_id),
FOREIGN KEY (member6) REFERENCES users(user_id),
FOREIGN KEY (member7) REFERENCES users(user_id),
FOREIGN KEY (member8) REFERENCES users(user_id),
FOREIGN KEY (member9) REFERENCES users(user_id)
);
你可以清楚地看到这里有很多值是空的。如果一个文件有5000个成员,那么创建这样数量的列可能会很困难,而且许多值将为空。
我知道Instagram使用SQL,我如何将这些数据存储在MYSQl中,而且我应该能够基于这些数据的外键连接表。
正确的存储方式是使用不同的表:
CREATE TABLE files (
file_id INT AUTO_INCREMENT PRIMARY KEY,
file_name VARCHAR(50) NOT NULL,
file_admin INT NOT NULL
);
CREATE TABLE file_members (
file_member_id INT AUTO_INCREMENT PRIMARY KEY,
file_id INT NOT NULL
member_id INT NOT NULL,
FOREIGN KEY (file_id) REFERENCES files(file_id),
FOREIGN KEY (member_id) REFERENCES users(user_id),
UNIQUE (file_id, member_id)
);
请注意,not null
在主键上是多余的,并且主键声明可以是内联的。