4

次のことを考慮して、(データベースの観点から) スプレッドシートをモデル化する最良の方法を見つけようとしています。

  • スプレッドシートには、可変数の行を含めることができます。
  • スプレッドシートには、可変数の列を含めることができます。
  • 各列には 1 つの値を含めることができますが、その型は不明です (整数、日付、文字列)。
  • データを含む CSV ファイルを生成するのは簡単 (かつ効率的) でなければなりません。

私は次のようなことを考えています:

class Cell(models.Model):
    column = models.ForeignKey(Column)
    row_number = models.IntegerField()    
    value = models.CharField(max_length=100)

class Column(models.Model):
    spreadsheet = models.ForeignKey(Spreadsheet)
    name = models.CharField(max_length=100)
    type = models.CharField(max_length=100)

class Spreadsheet(models.Model):
    name = models.CharField(max_length=100)
    creation_date = models.DateField()

スプレッドシートをモデル化するためのより良い方法を考えられますか? 私のアプローチでは、データを文字列として保存できます。CSVファイルの生成が遅いのが気になります。

4

5 に答える 5

4

関係の観点から:

Spreadsheet <-->> Cell : RowId, ColumnId, ValueType, Contents

行と列がエンティティである必要はありませんが、必要に応じて可能です

于 2008-10-26T18:20:01.277 に答える
3

データベースは、このために設計されていません。ただし、いくつかの異なる方法を試すことができます。

それを行う単純な方法は、One Table To Rule Them All のバージョンを実行することです。つまり、予測可能なスプレッドシートをカバーするのに十分な列を持つ、すべての型が (n)varchar である巨大な汎用テーブルを作成します。次に、Column1 のスプレッドシートの列名、格納する型 (キャストインおよびキャストアウトできるようにするため) など、最初のテーブルに関するメタデータを格納するための 2 つ目のテーブルが必要になります。次に、実行するトリガーが必要になります。入ってくるデータとメタデータをチェックして、データが破損していないことを確認する挿入など。ご覧のとおり、この方法は完全で完全なクラスターです。私はそれから叫んで走ります。

2 番目のオプションは、データを XML として保存することです。最新のデータベースのほとんどには、XML データ型があり、クエリ内で xpath がサポートされています。また、XSD を使用してある種のデータ検証を提供したり、xslt を使用してそのデータを CSV に変換したりすることもできます。現在、構成ファイルで同様のことを行っていますが、これまでのところ問題なく機能しています。パフォーマンスの問題についてはまだ何も言われていませんが、私はそれについては Knuth を信頼しています。

最初のオプションは、おそらく検索がはるかに簡単で、データの取得が高速ですが、2 番目のオプションはおそらくより安定しており、プログラミングが間違いなく簡単です。

こういう時はCelkoにSOアカウントがあればいいのに。

于 2008-10-26T18:21:11.240 に答える
2

同様の問題を解決しようとしている EAV (Entity-attribute-value) データ モデルを検討することをお勧めします。

エンティティ属性値 - ウィキペディア

于 2008-10-26T18:19:41.900 に答える
1

最適なソリューションは、データベースの使用方法によって大きく異なります。予想される上位のユース ケースをいくつか見つけてから、設計を決定してください。たとえば、データベースから特定のセルの値を取得するユースケースがない場合 (データは常に行レベルで、または行のグループでさえもロードされます)、「セル」をそのように保存する必要はありません。

于 2008-10-26T18:20:03.023 に答える