ユーザーがデータを保存するためのテーブルを作成できるプロジェクトに取り組んでいます。これを実装する最良の方法は何でしょうか?現在、私はそれを次のようにしています:
テーブル「テーブル」-名前などのユーザー設定が含まれます。
テーブル「行」-IDと「テーブル」との関係が含まれます。
テーブル「セル」-ID、値、位置、および「行」との関係が含まれます。
これを行うためのよりクリーンなまたはより良い方法はありますか?
私はこれを代替手段としてのみ提案しています-それはあなたの最良の選択肢かもしれませんし、そうでないかもしれません。 SQL Serverは、XMLドキュメントで完全なXPath/XQueryを使用したXML列をサポートしています。
https://msdn.Microsoft.com/en-us/library/hh403385.aspx
これにより、データ用に個別のスキーマ/ユーザーテーブルを作成する必要がなくなります。すべての情報を1つの列に含めることができます。挿入するにはユーザーのテーブルをXMLにシリアル化し、表示するにはシリアル化を解除するだけです。
ただのアイデア...
@RobertHarveyが内部プラットフォームについて言及して以来、
RDBMses機能を使用してテーブルを保守しないのはなぜですか?ユーザーテーブルを配置する個別のスキーマを作成します。ユーザーテーブルごとに、usertable_userId_counter
のような名前のDBテーブルを作成します。
そのテーブル内のすべての行と列を定義します。 SQLiteのROW_IDと同様に機能するインクリメントカウンターを定義することもできます。
CREATE TABLE usertable_4711_1;
ALTER TABLE usertable_4711_1 ADD COLUMN rowid INT NOT NULL AUTO INCREMENT;
ALTER TABLE usertable_4711_1 ADD COLUMN col1 VARCHAR(255);
...
ALTER TABLE usertable_4711_1 ADD COLUMN colX VARCHAR(255);
// inserts and updates go alike
INSERT INTO usertable_4711_1 (col1, col2, col3) VALUES ('data', 'data', 'data')
ユーザーがより多くのメタデータ(またはより複雑な制約)をテーブルに配置できるようにしたい場合は、メタデータを保持するテーブルusertable_userId_counter_meta
を作成することもできます。
これはSQLで物事を再現しようとするよりもはるか優れたパフォーマンスをもたらすと思います。適切なクエリビルダーを使用すると、ユーザー定義のテーブルを安全に処理できます。
3つのテーブルが必要な場合は、次のように実行できます。
テーブル-table_id, name, created_at, updated_at
行-row_id, table_id, row_type, row_pos, created_at, updated_at
列-column_id, table_id, row_id, column_pos, column_val, created_at, updated_at
row_type
は、行にテーブルヘッダーを含めることもできるためです。列挙型を設定して、header
またはdata
であることを示すことができます。
Tables
テーブル
| TableID | TableName |行| Colls |
TableData
テーブル
| TableDataId | TableID |行|列|詳細|
テーブルテーブルID、名前
Column列ID(主キー)、TableID(外部キー)、位置、名前、DataType、一意(ブール)。 {TableID、Position}の組み合わせは一意である必要があります。
データ ColumnID、RowID、Value。 {ColumnID、RowID}の組み合わせは一意である必要があります。