状況の開始:MySQLで既存のスキーマ(最初のデータベース - 広く設置ように変更することはできません)と非常に同じであるMS SQLの既存のデータベーススキーマがあります。ただし、対応する列に使用されているデータはわずかに異なる場合があります。そのデータベースシステムはC#経由でアクセスする必要があります。(ほとんど)同じスキーマを持つ異なるデータベースシステムへのアクセスを適切にカプセル化するにはどうすればよいですか?
問題:彼はMySQLやMSSQLデータベースに照会した場合にどのように適切にプログラマが意識してはならないアプリケーションの観点、すなわちから2のいずれかへのアクセスをカプセル化することができますか?
例:私はテーブルを持って、BIGINTの主要欄「ID」とvarcharの列「データ」を有する、MyTableと言います。
私の考えは、自動的にすべてのCRUD操作を生成するEntityFramework(バージョン6)を使用することでした。そこで私は論理層に注入したいMySQLとMSSQLの両方の.edmxモデルを作成しました。しかし、MySQLの場合、ID(bigint)は10進数にマッピングされていましたが、MS SQLではそれがlongにマッピングされていました。ここでは、2つのデータベースシステムで同じ(名前付きの同じ名前の)列に対して異なるデータ型が存在するため、このEFアプローチが適しているのだろうかと思います。この理由から、同僚は、レガシーソフトウェアバージョンで行われているように、つまりEFをまったく使用せず、MS SQLとMySQLの両方のプレーンSQLで実装されたファサードメソッドを提供するだけで、すべてのステートメントを自分で書くことを好みます。
しかし私は、データベース・アクセスをカプセル化する必要が上述したように、私は...自分で
をすべてのSQL文を書くのファンではない - しかし、別のデータベース・システムの異なるマッピングが存在する場合それをどうやって行うの?そこにMSSQLとMySQLのマッピングの間に違いがあるが、このアプローチは私が思う抽象化の抽象化につながる場合、私はEFモデルの前にファサードを構築し、実装できアダプター(データ型を、APIを言います)。
提案がありますか?我々は両方のデータベース構造はほぼ同じであるように、単一のコンテキストを使用するために管理:興味のある方のために
アプリケーションがSQL ServerとMySQLを切り替えることができるので、1つのインストールでMySQLがバックエンドとして使用され、同じアプリケーションの別のインストールでSQL Serverが使用されることを意味しますか? –
まさに!最初に照会する必要がある設備データベースがあります。例:「装置Aの場所を教えてください。結果:「サーバーXYのMS SQLデータベース」または「サーバーZのMySQLデータベース」。次に、アプリケーションはMS SQLまたはMySQLのどちらかを照会する必要があります。両方のシステムのスキーマはほとんど同じですが、100進歩ではありません。そのため、現在使用されているプレーンSQLが存在します。 – Meandron
SQL ServerとSQL Compact for EF6でこれを行いましたが、これらの2つのデータ型は非常に似ています。他のORMフレームワーク(Hibernate ..)もチェックしてください。 –