【问题标题】:Master and multiple child database tables vs. master and a 'properties' table主数据库表和多个子数据库表与主表和“属性”表
【发布时间】:2011-07-12 19:01:56
【问题描述】:

在我的 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

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

【问题讨论】:

    标签: ruby-on-rails database-design


    【解决方案1】:

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

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

    因此,如果案例是车辆、卡车和轿车,则每辆卡车或轿车在车辆表中都有一个条目,卡车也将在卡车表中具有一个条目,其 PK 是相应 PK 的副本车辆表。轿车和轿车桌也是如此。只需进行联接就可以很容易地确定车辆是卡车还是轿车,而且您通常希望在这种查询中加入数据。

    【讨论】:

    • 谢谢,找到了这个,最终得到了帮助:agiledata.org/essays/mappingObjects.html。阐明/列出了已知的可能解决方案。
    • 谢谢。我想我会在我对此类问题的样板回复中添加对本文的具体引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多