2011-07-11 8 views
0

私の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) 

この情報を格納するためのより有利なデータベースのテーブルの設計でしょうか? ( 'プロパティ' テーブルとマスターテーブル)

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

オプション1(各プロトコルのテーブルとマスターテーブル)

connection 
    id 
    name 

connection_properties 
    id 
    connection_id 
    property_name 
    property_value 

(心配しないで、資格情報を暗号化します)

答えて

1

あなたのケースはGen-Specデザインのインスタンスのようですパターン。 Gen-specは、スーパークラス - サブクラス階層を介してオブジェクト指向のプログラマーにはよく知られています。残念ながら、リレーショナル・データベース設計の導入は、Gen-Spec状況のための表の設計方法をスキップする傾向があります。幸いにも、それはよく理解されています。 "Relational database generalisation specialization"に関するWeb検索では、その件に関するいくつかの記事が得られます。あなたのヒットのいくつかはここで以前の質問になります。

トリックは、サブクラス(専用)テーブルのPKが割り当てられる方法です。それは何らかのオートナンバー機能によって生成されるものではありません。代わりに、それはスーパークラス(一般化された)テーブルのPKのコピーであるため、FKへの参照です。

したがって、ケースが車両、トラック、セダンであった場合、すべてのトラックまたはセダンは車両テーブルにエントリを持ちますが、トラックには対応するPKのコピーであるPKがトラックテーブルにも入ります車両テーブルに表示されます。セダンとセダンのテーブルも同様です。車をトラックやセダンにするかどうかは、単にジョインするだけで簡単に分かります。通常は、そのようなクエリでデータに参加したいと思うのです。

+0

ありがとうございました。これが見つかりました。http://www.agiledata.org/essays/mappingObjects.html。既に知られている可能な解決策を明示/記載した。 –

+0

ありがとうございます。私はこのilkの質問に対する私の定型的な回答に、この記事の特定の参考文献を追加すると思います。 –

関連する問題