私は現在、サイトのアイデアのためにいくつかのものを使いこなしています。ユーザーがデータを保持している「テーブル」を作成し、このデータをクエリできるようにしたいと思っています。 SQLクエリを書くとうまくいけば、Excelを使用するより簡単に)。SQLの "動的"テーブル?
これまで私の考えでは、データベース内にいくつかのテーブルを使用して表現しています。テーブルを表すテーブルが1つ、テーブルの列を表すテーブルが1つ、テーブルの各行を表すテーブルが1つ、 1つは値を表します。 (擬似SQL)に似て何か:
CREATE TABLE 'Tables' (
Id INT NOT NULL PRIMARY KEY,
NAME VARCHAR(255)
)
CREATE TABLE 'TableColumns' (
Id INT NOT NULL PRIMARY KEY,
TableId INT NOT NULL FOREIGN KEY ON 'Tables',
NAME VARCHAR(255)
)
CREATE TABLE 'TableRows' (
Id INT NOT NULL PRIMARY KEY,
TableId INT NOT NULL FOREIGN KEY ON 'Tables',
RowNumber INT NOT NULL
)
CREATE TABLE 'TableValues' (
RowId INT NOT NULL PRIMARY KEY,
ColumnId INT NOT NULL PRIMARY KEY,
Value VARCHAR(255)
)
(つまり私の事実とあまり気にしないでください、TableValuesテーブルがここ2つの、主キーのフィールドがあり、「複合」の主キーを表すことになっていますのでご注意構文は法的なSQLではない、それはちょうどアイデアを示すことになっている)。
これで少しのテストを行い、単純なクエリ(単純なフィルタリング、順序付けなど)を正常に実行できました。これを行う私のやり方は、まずTableRowsテーブルを照会することでした。フィルタリングのために、カラムが基準と一致しないローをフィルタリングしました。ソートのためにカラムの内容に基づいてRowIdsをソートしました。必要なものを選択するだけで、ここから希望の順序で行IDのリストが作成されました。
これはすべて問題なく動作しますが、ここから少し離れています。私はどうにかして(実際には私の主な問題である)異なるデータ型を表現することができますし、後で結合を行う方法を理解することもできます。
私はこれを行うより良い方法があるかどうか疑問に思っています。もちろん、ここでのパフォーマンスは重要な要素ですが、私は仮想テーブルごとに数十万行、おそらく約1000行の仮想テーブルをサポートするつもりはないことを覚えておいてください。もちろん、システム全体では多くのこれら。
これは、SQLクエリを使用して同様にクエリを実行するためにC#で作成されたクエリを使用してデータベースにテーブルを作成することができますが、ユーザーに "構築"このように私のデータベースに対してクエリを実行すると、それは多くのバグが現れるようなパスを導くかのように思えます。最悪のシナリオでは、ユーザーが一方向または他の方法でデータベースを強制終了できるようになります。
また、私の問題は、これをC#の観点から理解できる方法で処理する方法になります。これまでのところ、私はLINQの使用に慣れていて、必要な機能を適用する独自の拡張メソッドを作成すると思います。つまりExtensionMethodsがIQueryableを拡張しています。
これは、どのようにこれを行うことができるか、パフォーマンスを調整するアイデア、テーブルの別々のデータ型を扱う方法のアイデアです(もちろん、テーブルの列に型を格納します実際に値を格納して、フィルタリング、並べ替えなどを行うことができますか?テーブルのテーブルに「TextValue」、「MoneyValue」などの列を追加するだけでなく)。最後に、ここでいくつかの良い議論ができればと思っています。私は少なくともこれをやや面白い話題と考えています。
私はこれをhttp://www.thedailywtf.comに送るインセンティブとして投票しています。 – TheTXI
TheTXIによれば、この種の「スキーマ」は毎日のWTFで常に見られます。それは信じられないほど悪い考えです。そして陽気。 – Welbog
私はこれが悪いスキーマであるというアイデアを持っていました。アイデアを改善する方法についていくつかのアイデアを得るために、私はここに投稿しました。このようなやり方で行われているかどうかではなく、私が達成できるものを気にしています。そしてまた、私は学習を気にします:)。 – kastermester