web-dev-qa-db-ja.com

「テーブル」を保存するためのデータベース構造

ユーザーがデータを保存するためのテーブルを作成できるプロジェクトに取り組んでいます。これを実装する最良の方法は何でしょうか?現在、私はそれを次のようにしています:

テーブル「テーブル」-名前などのユーザー設定が含まれます。

テーブル「行」-IDと「テーブル」との関係が含まれます。

テーブル「セル」-ID、値、位置、および「行」との関係が含まれます。

これを行うためのよりクリーンなまたはより良い方法はありますか?

6
user263337

XML列

私はこれを代替手段としてのみ提案しています-それはあなたの最良の選択肢かもしれませんし、そうでないかもしれません。 SQL Serverは、XMLドキュメントで完全なXPath/XQueryを使用したXML列をサポートしています。

https://msdn.Microsoft.com/en-us/library/hh403385.aspx

これにより、データ用に個別のスキーマ/ユーザーテーブルを作成する必要がなくなります。すべての情報を1つの列に含めることができます。挿入するにはユーザーのテーブルをXMLにシリアル化し、表示するにはシリアル化を解除するだけです。

ただのアイデア...

2
neilsimp1

@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で物事を再現しようとするよりもはるか優れたパフォーマンスをもたらすと思います。適切なクエリビルダーを使用すると、ユーザー定義のテーブルを安全に処理できます。

2
marstato

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 |行|列|詳細|

0
Standup Report

テーブルテーブルID、名前

Column列ID(主キー)、TableID(外部キー)、位置、名前、DataType、一意(ブール)。 {TableID、Position}の組み合わせは一意である必要があります。

データ ColumnID、RowID、Value。 {ColumnID、RowID}の組み合わせは一意である必要があります。

0
John Wu