【发布时间】:2015-05-25 06:54:05
【问题描述】:
比如说,我有一个不是任意深度的嵌套结构。例如。员工和部门。
我想支持的最常见用途是显示部门及其员工的列表,并带有分页(X employees/page,而不是部门)。像这样的:
- Department A
- Person 1
- Person 2
- ...
- Department B
- ...
我应该如何存储它们?还有,我应该如何查询它们?
到目前为止我的解决方案:
似乎该结构可以很好地与基于文档的存储(或者可能是键值存储)一起使用。但是,我不知道如何在这种情况下进行分页。
如果我使用关系数据库,我能想到的最好的方法是获取X的员工人数,并在SQL中按部门列排序;显示时,如果当前人员与前一个人员在不同的部门,我们会为该部门打开一个新部分。
更新为an example for a flask solution:
这就是我可以用平面表或连接做的; Jinja 的groupby 进行内部排序,并应用我上面所说的逻辑。
让员工成为X 员工的列表。
<ul>
{% for department in employees|groupby('department') %}
<!-- this is the department name -->
<li>{{ group.grouper }}
<!-- list of employees -->
<ul>
{% for employee in group.list %}
<li>{{ person.department_name }} {{ person.name }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
这就是Jinja 在groupby 中所做的事情:sorted(map(_GroupTuple, groupby(sorted(value, key=expr), expr)))
更新 2:
我唯一的问题是如何显示像上面这样的一级嵌套关系(请参阅部门/人员树)?存储和查询方面是我想了解的细节(并强调这些选项的问题是灵活的)。我最初询问如何将其进一步扩展到多级嵌套,这确实是不必要的混乱,因此将其删除。
Neil 评论说数据模型应该是相同的,“无论您是否正在分页”以及您是否有“一个或多个级别的部门嵌套”。很公平;如果它可以用相同的模型很好地完成,我很高兴。对于评论#4,如果我在 SQL 中排序(而不是在 python 中),我可以摆脱上面 Jinja 代码中的内部sorted,这可能有也可能没有一些好处。
对于评论 #2,虽然“使用树状 GUI 小部件进行分页”可能并不常见,但我仍然想要它;它不受欢迎的事实并没有真正改变我的问题。
【问题讨论】:
标签: sql database database-design key-value-store nosql