主和多子数据库表与主数据库和'属性'表

时间:2011-07-11 20:07:52

标签: 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, 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

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

1 个答案:

答案 0 :(得分:1)

您的案例看起来像是Gen-Spec设计模式的一个实例。通过超类 - 子类层次结构,面向对象的程序员熟悉Gen-spec。不幸的是,对关系数据库设计的介绍倾向于跳过如何为Gen-Spec情况设计表。幸运的是,它很好理解。关于“关系数据库泛化专业化”的网络搜索将产生关于该主题的若干文章。你的一些热门歌曲将是之前的问题。

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

因此,如果案件是车辆,卡车和轿车,每辆卡车或轿车都会在车辆工作台上有一个入口,卡车也会在卡车桌上有一个入口,其PK值是相应PK的副本。车辆表。同样适用于轿车和轿车表。只需进行连接就可以很容易地判断出车辆是卡车还是轿车,而且您通常也想在这种查询中加入数据。