2011-05-11 36 views
4

我正在构建一个可以上传一些静态数据并需要一些建议的Web应用程序。数据库设计和文件存储服务器

开始时,我想使用内部磁盘,但是如果数据增长,我打算使用Amazon S3作为文件存储,我认为我需要多个文件存储容器 - 也许我会使用其他一些CDN提供商。

而且,我有以下的数据库结构:

CREATE TABLE IF NOT EXISTS `storage_servers` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `name` VARCHAR(45) NOT NULL , 
    `ip` INT(20) NOT NULL , 
    `access_url` LONGTEXT NULL DEFAULT NULL , // storing server access URL 
    `username` LONGTEXT NULL DEFAULT NULL , //storing server username 
    `password` LONGTEXT NULL DEFAULT NULL , // storing server password 
    `token` LONGTEXT NULL DEFAULT NULL , // storing server access token, if any 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB;' 

CREATE TABLE IF NOT EXISTS .`storage_servers_files` (
    `server_id` INT NOT NULL , 
    `file_id` BIGINT(25) NOT NULL , 
    INDEX `fk_servers_files_1` (`file_id` ASC) , 
    INDEX `fk_servers_files_2` (`server_id` ASC) , 
    CONSTRAINT `fk_servers_files_1` 
    FOREIGN KEY (`file_id`) 
    REFERENCES `files` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_servers_files_2` 
    FOREIGN KEY (`server_id`) 
    REFERENCES `storage_servers` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

但是我不是用户,如果我的做法是在这件事公平。

据我所知,我需要为每个单独的存储容器(cdn1.example.com,cdn2.example.com ... cdn15.example.com)创建子域。你会如何设计表格?

我的另一个想法是完全和只是删除storage_serversstorage_servers_files表......在files表中创建一个字段server,然后存储子域名。然后应该将配置存储在配置文件中。

是不是被过度工程化了一下?

回答

0

不,它不是过度工程。看起来你的设计对我来说可以。

1

一些建议 -

随着S3你不需要多个容器或桶只是规模的增长。 S3 Buckets可容纳无限数量的对象(无限制,我的意思是您可能会在AWS耗尽空间之前耗尽商品或付款)。创建多个存储桶的原因是针对不同的应用程序空间或安全性。使用AWS IAM,您可以限制对特定应用程序或用户的存储区访问权限。

在这种情况下,如果您只有一个应用程序使用单个存储桶,则可能需要将安全设置存储在配置中。另外,根据我的经验,随着时间的推移,很多人可能最终会对数据库(开发人员,分析师,项目经理,DBA等)有一些访问权限。访问源代码管理和服务器通常更有限,并且更好地跟踪更改。出于这个原因,我宁愿在可能的情况下将密码和令牌保存在数据库之外。

如果您将来转移到CDN,您仍然需要CDN从您的文件的源出处。

不知道你的ip列是什么,但你可能不想使用DnsName而不是ip,因为ip地址可以改变很多(特别是使用AWS服务)。