【发布时间】:2020-05-28 18:30:25
【问题描述】:
我有两个看起来像这样的表:
uploads
________
id (primary key)
user_id
file_checksum
upload_information
---------
upload_info_id (primary key)
file_checksum
metadata1
metdata2
我试图强制执行的“多对一”关系是这样的:
- 许多上传文件可以具有相同的文件校验和
- 但是,文件校验和只能指向一个
upload_information记录,因此file_checksum和upload_info_id之间的唯一约束在upload_information表中是强制性的。
我想知道如何在 Postgres 中更改这些表以实现这种关系。
CREATE TABLE uploads (
id SERIAL NOT NULL PRIMARY KEY,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
user_id VARCHAR NOT NULL,
file_checksum VARCHAR NOT NULL,
);
CREATE TABLE upload_information (
upload_info_id SERIAL NOT NULL PRIMARY KEY,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
file_checksum VARCHAR NOT NULL,
file_name VARCHAR NOT NULL,
source_file_url VARCHAR NOT NULL,
);
【问题讨论】:
-
当两个用户上传相同的内容但文件名和来源网址不同时,您希望发生什么?
-
唯一重要的是文件内容的MD5校验和,其他信息来自内部来源,不是用户编辑的。
-
MD5 is broken,即使是文件校验和。我可以建议转到SHA-2 吗?我还建议将校验和存储为
bytea,而不是其十六进制字符串表示。效率更高。
标签: postgresql