我在设计应用程序数据库时遇到了问题。我在网上搜索了类似的结构但却找不到任何结构。所以这是一个问题:
我有一个使用搜索页面和数据网格设计的页面。请参见下面的屏幕截图:
我有一个名为联系人的表,它与身份及其子类型有关系。
身份类型现在只包含两个值,但未来可能会增加(停车,生活区域),根据下拉列表中选择的项目,搜索字段会更改,网格视图也会更改(参见头)。第一幅图像显示,当选择身份类型停车时,用户可以按部分,车道,行和停车编号过滤结果。
如果我们更改标识类型,则会再次更改搜索字段,并且两个标识类型中的行字段相同。
用户应该能够为数据库中的联系人(在联系人表格中)保存从网格中选择的详细信息。
我很困惑,我应该如何设计一个数据库,该数据库将显示带有身份和这些身份字段的网格,而不是可以通过与联系人的关系保存到数据库。
这是我想出来的东西
我仍然不清楚所选行将如何保存在数据库中。
对此有任何帮助将不胜感激。
答案 0 :(得分:2)
我认为你需要稍微改变一下你的方法。首先,您应该设计包含业务数据的数据库,而不必担心如何保存搜索对话框的状态。在这一点上包括这些只会混淆设计。
你给出的图表看起来不错。您应该删除表'IdentityType'。这不是一个好桌子 - 它包含两种完全不同的东西。这始终是SQL数据库中出错的线索。在OO中,我们可能有两个类ContactIdentity
和BuildingIdentity
继承自公共基类或接口,但这不是在SQL中执行它的正确方法。
现在,您应该能够使每个搜索页面都能在Javascript中运行。尝试这样做,忘记你想要一个适用于不同列集的'通用案例'解决方案。你似乎还有两个问题:
首先是您如何设计应用程序的问题。您不应期望接口将完全反映数据库结构。您可以拥有更多的数据库表,并且仍然具有相同的两种搜索方法。或者您可以使用其他搜索方法,仍然使用您当前使用的相同表格。无论哪种方式,您都应该小心尝试从数据库表的结构中自动生成搜索页面。而是选择您可能使用的“视图”,并找到表示其元数据的好方法。例如,这可以是可以过滤/排序的列的列表。或者是SQL查询的文本,它检索表中要包含的所有项目。
其次,您要保存搜索。有两种方法可以执行此操作 - 是否要保存搜索参数(以便可以在不同时间再次运行相同的过滤/排序,可能更改的数据,并显示最新结果?或者是否要保存结果,以便用户可以准确查看他们找到的那段时间?
我倾向于认为第一个更有意义,因为这意味着他们没有看到可能已经过时的东西。如果是这种情况,我会尝试将所有过滤器等的详细信息存储在类似JSON对象的内容中。 (您也可以使用XML - 我倾向于认为JSON更容易使用。)在JSON中可能看起来像这样:
{
"query": "parking",
"filters": {
"section": "A",
"lane": [1, 2, 5, 6],
"row_number": {
"greater_than": 10
},
},
"selected": [1,2 3, 4]
}
现在,您可以将JSON文档保存在数据库中,该数据库不必是,但可以与保留停车数据的数据库相同。您可以将其同样存储在类似文档数据库的内容中。您希望在该数据库中拥有与应用程序和查询的使用相关的数据,例如保存搜索的用户,会话ID,保存时间戳等等。在这种方法中,不必担心将搜索链接到搜索时所存在的数据集。
另一种方法是保存搜索时选择的行中的所有标识符。我认为这有点问题。如果数据库中的标识符发生更改,而右侧ID不再具有其他详细信息的行,该怎么办?如果某人选择了一个条目,因为它位于特定建筑物的特定楼层,现在又不再了?
无论如何,在这种情况下,如果您确定标识符仍然引用相同的数据,您可能只想保存ID列表。在SQL中执行此操作的方法可能是这样的:您创建一个表saved_search,其中包含用户ID,时间保存等。然后创建两个“关联表”:
CREATE TABLE saved_search_parking
(
saved_search_id int,
parking_id int,
CONSTRAINT uc_saved_search_parking UNIQUE (saved_search_id, parking_id)
)
和类似的表saved_search_living_area
。对于已保存搜索中的每个停放,您可以在表格中创建一条链接它们的行。一个保存的搜索包含多个停放,一个停车可以包含在多个保存的搜索中。这意味着您可以在已保存的搜索中同时拥有停车位和起居区。但我认为,与替代设计相比,这是一个小缺点。在任何情况下,将已保存搜索加载到“停放”页面的代码只应查看saved_search_parking
表,并且与“生活区域”页面相同。
答案 1 :(得分:0)
您的过滤器需要运行生成表查询,以便将结果保存在新表中。然后,您可以根据需要将结果发送到报告或电子邮件。关键是生成表查询。