これは、ほとんどの場合、重要な作業です。幸運にも、Ruby on Rails や CakePHP などの最新のフレームワークのスキーマを分析でき、開発者が列の規則に従うことに厳密に取り組んでいる場合は、すべてではないが多くのスキーマを見つける合理的な可能性があります。 、暗黙の関係の。
つまり、テーブルがテーブルuser_id
内のエントリを参照するような列を使用している場合users
。
注意: 一部のエンティティ名は不規則に複数形になる場合があり(entity
良い例: entities
, not entitys
)、これらはキャッチするのが困難です (ただし、可能性はあります)。admin_id
ただし、開発者が users テーブルに参加するキーなどはuser.id
推測できません。これらのケースは手動で処理する必要があります。
あなたは RDBMS を指定していませんでしたが、私は MySQL をよく使用しており、現在この問題に取り組んでいます。
次の MySQL スクリプトは、列名によって暗示されるほとんどの関係を推測します。次に、テーブル名を見つけることができなかったリレーションシップを一覧表示するので、少なくともどれが欠けているかがわかります。推測された親と子が、単数形と複数形の名前、および暗黙の関係とともにリストされます。
-- this DB is where MySQL keeps schema information
use information_schema;
-- change this to the DB you want to analyse
set @db_name = "example_DB";
-- infer relationships
-- NB: this won't catch names that pluralise irregularly like category -> categories or bus_id -> buses etc.
select LEFT(COLUMN_NAME, CHAR_LENGTH(COLUMN_NAME) - 3 ) as inferred_parent_singular
, CONCAT(LEFT(COLUMN_NAME, CHAR_LENGTH(COLUMN_NAME) - 3 ),"s") as inferred_parent_plural
, C.TABLE_NAME as child_table
, CONCAT(LEFT(COLUMN_NAME, CHAR_LENGTH(COLUMN_NAME)-3), "s has many ", C.TABLE_NAME) as inferred_relationship
from COLUMNS C
JOIN TABLES T on C.TABLE_NAME = T.TABLE_NAME
and C.TABLE_SCHEMA = T.TABLE_SCHEMA
and T.TABLE_TYPE != "VIEW" -- filter out views; comment this line if you want to include them
where COLUMN_NAME like "%_id" -- look for columns of the form <name>_id
and C.TABLE_SCHEMA = T.TABLE_SCHEMA and T.TABLE_SCHEMA = @db_name
-- and C.TABLE_NAME not like "wwp%" -- uncomment and set a pattern to filter out any tables you DON'T want included, e.g. wordpress tables e.g. wordpress tables
-- finally make sure to filter out any inferred names that aren't really tables
and CONCAT(LEFT(COLUMN_NAME, CHAR_LENGTH(COLUMN_NAME) - 3 ),"s") -- this is the inferred_parent_plural, but can't use column aliases in the where clause sadly
in (select TABLE_NAME from TABLES where TABLE_SCHEMA = @db_name)
;
これにより、次のような結果が返されます。
次に、次の方法で検出された命名規則の例外を調べることができます。
-- Now list any inferred parents that weren't real tables to see see why (irregular plurals and columns not named according to convention)
select LEFT(COLUMN_NAME, CHAR_LENGTH(COLUMN_NAME) - 3 ) as inferred_parent_singular
, CONCAT(LEFT(COLUMN_NAME, CHAR_LENGTH(COLUMN_NAME) - 3 ),"s") as inferred_parent_plural
, C.TABLE_NAME as child_table
from COLUMNS C
JOIN TABLES T on C.TABLE_NAME = T.TABLE_NAME
and C.TABLE_SCHEMA = T.TABLE_SCHEMA
and T.TABLE_TYPE != "VIEW" -- filter out views, comment this line if you want to include them
where COLUMN_NAME like "%_id"
and C.TABLE_SCHEMA = T.TABLE_SCHEMA and T.TABLE_SCHEMA = @db_name
-- and C.TABLE_NAME not like "wwp%" -- uncomment and set a pattern to filter out any tables you DON'T want included, e.g. wordpress tables e.g. wordpress tables
-- this time only include inferred names that aren't real tables
and CONCAT(LEFT(COLUMN_NAME, CHAR_LENGTH(COLUMN_NAME) - 3 ),"s")
not in (select TABLE_NAME from TABLES where TABLE_SCHEMA = @db_name)
;
これにより、手動で処理できる次のような結果が返されます。
これらのスクリプトを変更して、必要に応じて外部キー作成ステートメントを含めて、便利なものを吐き出すことができます。ここで、最後の列は単純な「has many」関係ステートメントです。これは、非常に単純な構文 (「pidgin」と呼ばれる) で記述された関係ステートメントに基づいて、その場で関係図を描画する高速モデリング ツールである pidgin と呼ばれる、私が作成したツールで使用します。http://pidgin.gruffdavies.comで確認できます。
上記のスクリプトをデモ DB で実行して、期待できる結果を示しました。
私はスクリプトで不規則な複数形に対応していませんが、少なくとも -y で終わるエンティティの場合は、それも試してみるかもしれません。自分で試してみたい場合は、<name>_id
列名をパラメーターとして取り、その_id
部分を取り除き、ヒューリスティックを適用して正しく複数形にするストアド関数を作成することをお勧めします。
それが役に立つことを願っています!