1

都市と地域を持つ必要がある挿入を作成できるユーザーを持つプリミティブ データ モデルがあります。複数の都市に関連する記事を準備する (たとえば、2 つ以上の都市で同じ製品を提供する場合、記事が接続されている都市ごとに記事が重複するのではなく、都市のリストを含む 1 つの記事になるようにするため)に)。

class Region(db.Model):
    name = db.StringProperty()
    countrycode = db.StringProperty()
    vieworder = db.IntegerProperty() # custom ORDER BY variable to order by population 
    areacode = db.IntegerProperty()
    areacodes = db.ListProperty(int)


class City(db.Model):
    region = db.ReferenceProperty()
    name = db.StringProperty()
    vieworder = db.IntegerProperty()
    areacode = db.IntegerProperty()

それで、ストレージとビューを作成することはできましたが、データ モデルは良くありません。

class Article(db.Model):
    cities = db.ListProperty(db.Key)
    regions = db.ListProperty(db.Key)

インサートには次のようにコーディングされています。

if self.request.get('area'):
    city = model.City.get_by_id(long(self.request.get('area')))
    region = model.Region.get(city.region.key())
    article.cities.append(city.key())
    article.regions.append(region.key())
    article.city = unicode(city.name)
    article.region = unicode(region.name)
    article.put()

これは冗長性を生成し、あまりきれいではありません (フィールドにリストを保存したため、1NF ではありません)。

ここに画像の説明を入力

検索 API のインデックスを作成するとき、今のところ 1 つの都市しか使用していませんが、都市のリストと地域のリストを処理する予定です (ただし、都市が 2 つの地域に存在することはあり得ないため、都市リスト以外はすべて冗長ですが、検索やビューでの長いルックアップを避けるために冗長性を節約します)。参照プロパティとキーを正しく使用したかどうか、代わりに NDB モデルを使用した方がよいかどうか疑問に思います。

4

2 に答える 2

3

まず第一に、1NF に関心があり、正規化がデータストアのことを忘れている場合は、Google Cloud SQL (MySQL) またはその他のリレーショナル データベースが必要です。ウィキペディアは次のように述べています。

第 1 正規形 (1NF) は、リレーショナル データベースの関係のプロパティです。

この「NOSQL」の階層的なキー値データストアでアプリを構築する場合、スケーラブルなパフォーマンスが必要であることを意味します。結合は高価ですが、ディスクスペースはそうではありません。データを複製し、非正規化して、高速にアクセスできるようにします。RDBMS モデリングについて学んだ「善悪」は忘れてください。あなたはそこで別の世界にいます。

あなたの場合、アプリをスケーリングしたい場合は、記事で地域/都市/国/その他のものを複製する必要があるため、追加のクエリをいくつか作成する必要はありません。あなたの都市は名前を変更しないため、ユースケースはデータストアに適合します。

簡単にするために: データストアの制限 (エンティティ サイズ、書き込みスループット、クォータなど) を破ることなく、ユース ケースに必要なすべてを 1 つのクエリで取得できるようにデータをモデル化します。

于 2014-03-20T13:31:04.993 に答える