本站消息

站长简介/公众号


站长简介:高级工程师,爱好交友,无偿辅导python和前端,技术交流,面试指导,找工作指导,瞎聊都可加我微信i88811i哈,欢迎欢迎!也欢迎加入程序员交流群,专属程序员的圈子,加我微信拉你进群.欢迎关注我的微信公众号:程序员总部,程序员的家,探索程序员的人生之路!分享IT最新技术,关注行业最新动向,让你永不落伍。了解同行们的工资,生活工作中的酸甜苦辣,谋求程序员的最终出路!

  价值13000svip视频教程,python大神匠心打造,零基础python开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

在 python 中将字典建模为可查询的数据对象

发布于2022-01-18 09:37     阅读(982)     评论(0)     点赞(13)     收藏(5)



我有一个简单的书目录字典如下

{ 
  'key':
  {
  'title': str,
  'authors': [ {
                 'firstname': str,
                 'lastname': str 
               }
             ],
  'tags': [ str ],
  'blob': str
  }
}

每个book都是字典中的字符串键。一本书包含一个title,并且可能有很多authors(通常只有一个)。Anauthor由两个字符串组成,firstname并且lastname. 我们还可以将许多tags书与小说文学艺术1900 年代等相关联。每本书都作为blob包含附加数据的字段。(通常是书本身)。我希望能够根据数据(如作者、标签)搜索给定条目(或其中一组)。

我的主要工作流程是:

  1. 给定一个查询,返回与每个条目关联的所有 blob 字段。

我的问题是如何对此进行建模,使用哪些库或格式来保持给定的约束:

  • 尽量减少数据对象的数量(首选单个数据对象以简化查询)。
  • 小列(为每个可能的标签创建一个新列可能很疯狂,并导致数据集非常稀疏)
  • 不要重复blob字段(因为它可能很大)。

我的第一个想法是为每个作者创建多行,例如:

{ '123': { 'title': 'A sample book',
           'authors': [ {'firstname': 'John', 'lastname': 'Smith'},
                        {'firstname': 'Foos', 'lastname': 'M. Bar'} ]
           'tags': [ 'tag1', 'tag2', 'tag3' ],
           'blob': '.....'
} 

最初会变成两个条目

编号 钥匙 标题 作者名字 作者姓氏 标签 斑点
0 123 样本 约翰 史密斯 ['标签1','标签2','标签3'] ...
1 123 样本 福斯 M.酒吧 ['标签1','标签2','标签3'] ...

但这仍然会复制 blob,并且仍然需要弄清楚如何处理未知数量的标签(随着数据库的增长)。


解决方案


你可以用它TinyDB来完成你想要的。

首先,将您的 dict 转换为数据库:

from tinydb import TinyDB, Query
from tinydb.table import Document

data = [{'123': {'title': 'A sample book',
                 'authors': [{'firstname': 'John', 'lastname': 'Smith'},
                             {'firstname': 'Foos', 'lastname': 'M. Bar'}],
                 'tags': ['tag1', 'tag2', 'tag3'],
                 'blob': 'blob1'}},
        {'456': {'title': 'Another book',
                 'authors': [{'firstname': 'Paul', 'lastname': 'Roben'}],
                 'tags': ['tag1', 'tag3', 'tag4'],
                 'blob': 'blob2'}}]

db = TinyDB('catalog.json')
for record in data:
    db.insert(Document(list(record.values())[0], doc_id=list(record.keys())[0]))

现在您可以进行查询:

Book = Query()
Author = Query()

rows = db.search(Book.authors.any(Author.lastname == 'Smith'))
rows = db.search(Book.tags.all(['tag1', 'tag4']))
rows = db.all()

给定一个查询,返回与每个条目关联的所有 blob 字段。

blobs = {row.doc_id: row['blob'] for row in db.all()}
>>> blobs
{123: 'blob1', 456: 'blob2'}

站长简介:高级工程师,爱好交友,无偿辅导python和前端,技术交流,面试指导,找工作指导,瞎聊都可加我微信i88811i哈,欢迎欢迎!也欢迎加入程序员交流群,专属程序员的圈子,加我微信拉你进群
欢迎关注我的公众号:程序员总部,关注公众号回复python,免费领取 全套python视频教程,关注公众号回复充值+你的账号,免费为您充值1000积分







所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/1256394/f34690f30ed2ee5ed211/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

13 0
收藏该文
已收藏

评论内容:(最多支持255个字符)