需要针对场景进行数据库设计

时间:2015-09-03 10:28:36

标签: database-design

我在设计应用程序数据库时遇到了问题。我在网上搜索了类似的结构但却找不到任何结构。所以这是一个问题:

我有一个使用搜索页面和数据网格设计的页面。请参见下面的屏幕截图:

The scenario when the first identity is chosen

我有一个名为联系人的表,它与身份及其子类型有关系。

身份类型现在只包含两个值,但未来可能会增加(停车,生活区域),根据下拉列表中选择的项目,搜索字段会更改,网格视图也会更改(参见头)。第一幅图像显示,当选择身份类型停车时,用户可以按部分,车道,行和停车编号过滤结果。

The scenario when the first identity is chosen

如果我们更改标识类型,则会再次更改搜索字段,并且两个标识类型中的字段相同。

用户应该能够为数据库中的联系人(在联系人表格中)保存从网格中选择的详细信息。

我很困惑,我应该如何设计一个数据库,该数据库将显示带有身份和这些身份字段的网格,而不是可以通过与联系人的关系保存到数据库。

这是我想出来的东西

Database Schema

我仍然不清楚所选行将如何保存在数据库中。

对此有任何帮助将不胜感激。

2 个答案:

答案 0 :(得分: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不再具有其他详细信息的行,该怎么办?如果某人选择了一个条目,因为它位于特定建筑物的特定楼层,现在又不再了?

无论如何,在这种情况下,如果您确定标识符仍然引用相同的数据,您可能只想保存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)

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