在我的Rails应用程序中,我希望允许用户通过不同的协议(FTP,SFTP,S3,Dropbox)连接到多个远程位置。每个地点都有不同的属性:
FTP: host, port, username, password, is_passive
SFTP: host, port, username, password
S3: bucket, key (not sure these are right; I'm guessing)
Dropbox: username, password (again, I'm guessing)
用于存储此信息的更有利的数据库表设计是什么?
选项1 (每个协议都有表格的主表格)
connection
id
name
protocol
ftp_connection
connection_id
host
username
password
port
is_passive
sftp_connection
connection_id
host
username
password
port
s3_connection
connection_id
bucket
key
dropbox_connection
connection_id
username
password
选项2 (带有'属性'表的主表)
connection
id
name
connection_properties
id
connection_id
property_name
property_value
(别担心,我会加密凭据)
答案 0 :(得分:1)
您的案例看起来像是Gen-Spec设计模式的一个实例。通过超类 - 子类层次结构,面向对象的程序员熟悉Gen-spec。不幸的是,对关系数据库设计的介绍倾向于跳过如何为Gen-Spec情况设计表。幸运的是,它很好理解。关于“关系数据库泛化专业化”的网络搜索将产生关于该主题的若干文章。你的一些热门歌曲将是之前的问题。
诀窍在于子类(专用)表的PK被分配的方式。它不是由某种自动编号功能生成的。相反,它是超类(通用)表中PK的副本,因此是对它的FK引用。
因此,如果案件是车辆,卡车和轿车,每辆卡车或轿车都会在车辆工作台上有一个入口,卡车也会在卡车桌上有一个入口,其PK值是相应PK的副本。车辆表。同样适用于轿车和轿车表。只需进行连接就可以很容易地判断出车辆是卡车还是轿车,而且您通常也想在这种查询中加入数据。