2015-09-03 37 views
1

我在设计我的应用程序数据库时碰到了一个问题。我在网上搜索了类似的结构,但无法找到任何结构。因此,这里的问题:需要针对场景的数据库设计

我设计了搜索页面一个页面,数据grid.see下面的屏幕截图:

The scenario when the first identity is chosen

我有一个表称为接触有一与身份和它的子类型的关系。

身份类型现在只有两个值,但未来可能会增加(停车位,居住面积),基于在下拉列表中选择的项目,搜索字段会发生更改,网格视图也会随之更改(请参阅标题)。第一个图像显示,当选择身份类型停车时,用户可以按部分,车道,行和停车编号过滤结果。

The scenario when the first identity is chosen

如果我们改变了身份输入搜索字段与场是相同的两个身份类型又变了。

用户应该可以选择保存在数据库中从电网联系人(在接触表)中选择的细节的能力。

我很困惑,我应该如何设计一个数据库,将显示与标识字段和这些身份不是可以用相对于接触被保存到数据库中的网格。

这里是我想出了

Database Schema

我仍然没有就如何将选定的行会被保存在数据库中清晰的东西。

任何帮助,将不胜感激。

回答

2

我认为你需要改变你的方法。首先,您应该设计包含业务数据的数据库,而不必担心如何保存搜索对话框的状态。在这一点上包括这些只会混淆设计。

你给出的图表看起来不错。你应该删除'IdentityType'表。这不是一张好桌子 - 它包含两种完全不同类型的东西。这总是在SQL数据库中出现错误的线索。而在OO中,我们可能有两个类ContactIdentityBuildingIdentity,它们从公共基类或接口继承,但这不是在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表格,并且与“生活区域”页面相同。

+1

终于有值得研究的东西。谢谢@ jwg –

0

你的过滤器需要运行生成表查询,将保存在一个新表中的结果。然后,您可以根据需要将结果发送到报告或电子邮件。关键是生成表查询。