【问题标题】:How to avoid duplicates in GAE datastore?如何避免 GAE 数据存储中的重复?
【发布时间】:2011-12-08 18:56:10
【问题描述】:

假设这里是数据库结构:

class News(db.Model):
    title = db.StringProperty()

class NewsRating(db.Model):
    user = db.IntegerProperty()
    rating = db.IntegerProperty()
    news = db.ReferenceProperty(News)

每个用户只能为每个新闻留下一个评分。以下代码不关心重复:

rating = NewsRating()
rating.user = 123456
rating.rating = 1
rating.news = News.get_by_key_name('news-unique-key')
rating.put()

我应该如何修改它允许每个rating.userrating.news 组合只有一条记录?如果这样的评级已经存在,那么应该用新的值更新它。

【问题讨论】:

    标签: google-app-engine google-cloud-datastore


    【解决方案1】:

    使用键名和(可能)父实体来跟踪。例如,假设你有一个UserInfo 类型,你可以这样做:

    class NewsRating(db.Model):
      # No explicit user reference, since it's the parent entity
      rating = db.IntegerProperty(required=True)
      news = db.ReferenceProperty(News) # We could get this from the key name, but this is more convenient
    
    rating = NewsRating(parent=current_user, key_name=str(news.key().id()), news=news)
    rating.put()
    

    尝试多次添加相同的评分只会覆盖现有评分,或者您可以使用数据存储事务以原子方式添加。

    请注意,您几乎肯定应该针对News 实体保留总评分,而不是计算每个请求的评分,随着评分数量的增加,效率会降低。

    【讨论】:

    • 尼克,是否可以有 2 条记录具有相同的 key_name,但父母不同?
    猜你喜欢
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 2019-03-09
    相关资源
    最近更新 更多