我认为你需要改变你的方法。首先,您应该设计包含业务数据的数据库,而不必担心如何保存搜索对话框的状态。在这一点上包括这些只会混淆设计。
你给出的图表看起来不错。你应该删除'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列表。在SQL中执行此操作的方式可能如下所示:使用用户标识创建表save_search,保存时间等。然后创建两个“关联表”:
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
表格,并且与“生活区域”页面相同。
终于有值得研究的东西。谢谢@ jwg –