Ruby on rails 主数据库表和多个子数据库表与主数据库表和a';属性';桌子

Ruby on rails 主数据库表和多个子数据库表与主数据库表和a';属性';桌子,ruby-on-rails,database-design,Ruby On Rails,Database Design,在我的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,

在我的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(主表和每个协议的表)

选项2(带有“属性”表的主表)


(别担心,我会加密凭证)

您的案例看起来像Gen Spec设计模式的一个实例。面向对象程序员通过超类-子类层次结构熟悉genspec。不幸的是,对关系数据库设计的介绍往往忽略了如何为genspec情况设计表。幸运的是,这是很好的理解。对“关系数据库泛化-专业化”的web搜索将产生关于该主题的几篇文章。你的一些热门话题将是前面的问题

诀窍在于子类(专用)表的PK的分配方式。它不是由某种自动编号功能生成的。相反,它是超类(广义)表中PK的副本,因此是对它的FK引用


因此,如果是车辆、卡车和轿车,则每辆卡车或轿车都会在车辆表中有一个条目,卡车也会在卡车表中有一个条目,其中PK是车辆表中相应PK的副本。对于轿车和轿车表也是如此。只需执行联接即可轻松确定车辆是卡车还是轿车,而且您通常都希望在这种查询中联接数据。

谢谢,找到了此项,它最终起到了帮助作用:。澄清/列出了已知的可能解决方案。谢谢。我想我会在对这类问题的样板回答中添加对本文的具体引用。
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
connection
    id
    name

connection_properties
    id
    connection_id
    property_name
    property_value