私は現在、サイトのアイデアのためにいくつかのものをいじっています-ユーザーがデータを保持する「テーブル」を作成し、このデータをクエリできるようにしたいと思っています(書くよりもオタクな方法ではありません) SQLクエリとうまくいけばExcelを使用するよりも簡単です)。
これまでの私の考えは、2つのテーブルを使用してデータベースでこれを表すことです。1つのテーブルがテーブルを表し、1つのテーブルがテーブルの列を表し、1つのテーブルがテーブルの各行を表し、最後に1つが値を表します。 。(PSEUDO 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テーブルをクエリすることでした-フィルタリングのために、列が基準に一致しなかった行をフィルターで除外し、並べ替えのために、列の内容に基づいてRowIdを並べ替えました(指定された並べ替えで指定されたとおり)。希望する順序で行IDのリストが作成されます。これ以降は、必要なものを選択するだけで済みます。
これはすべて正常に機能しますが、これからは少し行き詰まります。どういうわけか、さまざまなデータ型を表現できるようにしたいと思います(これは私の主な問題です)。また、後で結合を行う方法を検討します。
このすべてを考えている間、私はこれを行うためのより良い方法があるかどうか疑問に思い始めます。もちろん、ここでのパフォーマンスが要因であることに注意してください。ただし、数十万行、おそらく仮想テーブルあたり約1000行の仮想テーブルをサポートする予定はありません。もちろん、システム全体で多くのこれらは。
これを実現するために、C#でオンザフライで作成されたクエリを使用して、データベースにテーブルを実際に作成できます。同様に、SQLクエリのみを使用してクエリを実行できます。ただし、ユーザーがデータベースに対してクエリを「構築」できるようにすることは、これまで大ファンではありませんでした。このように-そしてそれは多くのバグが現れる道をたどるだろうように私には思えます-そして最悪の場合のシナリオはユーザーが何らかの方法でデータベースを殺すことを許してしまうでしょう。
また、私の問題は、C#の観点から意味のある方法でこれに対処する方法になります。これまでのところ、私はLINQの使用に傾倒していて、必要な機能を適用する独自の拡張メソッド、つまりIQueryableを拡張するExtensionMethodsを作成していると思います。
ですから、私が本当に望んでいるのは、これを行う方法のアイデア、パフォーマンスを調整する方法のアイデア、テーブル内の個別のデータ型を処理する方法のアイデアです(もちろん、タイプをテーブル列に格納しますが、実際に値を格納して、フィルターや並べ替えなどを実行できるようにしますか?-tablevaluesテーブルに「TextValue」や「MoneyValue」などの列を追加するだけではありません)。そして最後になりましたが、ここでいくつかの良い議論ができれば幸いです。少なくとも、これはやや興味深いトピックだと思います。