【问题标题】:Key Manager Database Design密钥管理器数据库设计
【发布时间】:2013-11-07 06:27:08
【问题描述】:

我的任务是使用 SQL Server 向现有的 Web 应用程序添加一些功能。

我的客户的公司提供一项服务,将密钥发给员工,然后他们会前往各个地点执行所要求的工作。她想跟踪谁拥有客户的钥匙。他们有大约 100-125 名客户和 6 名员工。她将是唯一一个使用 web gui 来发放和归还密钥的人。

为了获得灵感,我去谷歌找到了一个名为 KEY ORGANIZER 的演示程序,它可以在桌面上运行。它完全符合我的客户的要求,但它是桌面应用程序,而不是 Web 应用程序。所以,我想我只是对它进行逆向工程,然后根据客户的需求对其进行定制。桌面应用程序的功能远远超出了我的客户需求。以下是她正在寻找的内容的高级概述:

密钥的发放:

  1. 她点击客户姓名旁边的关键图片。假设她为客户准备了 3 把钥匙,但所有 3 把钥匙都已签出给员工。她会收到某种警报,说明没有可发出的密钥,但在库存关闭的情况下仍允许她发出密钥(因此数据库需要能够处理负值)。如果有可用的密钥,则继续执行下一个项目符号。

  2. 在下一个窗口中,她会看到一个表格。 (可供选择的员工姓名列表和今天的日期)。

  3. 她从下拉列表中选择员工并单击“确定”按钮,然后模式窗口关闭。

  4. 每次签出/签入都会输入一个日志条目,并会在每次签入和签出时向员工发送一封电子邮件。

钥匙归还:

  1. 她还希望能够选择客户姓名旁边的按钮以查看哪些员工当前拥有密钥,并能够选择员工姓名以返回密钥。

  2. 同样,我的客户希望单击员工的姓名以查看他们是否拥有密钥列表,并能够从列表中返回密钥。

  3. 每次签出/签入都会输入一个日志条目,并会在每次签入和签出时向员工发送一封电子邮件。

我不需要网页编码方面的帮助。我只需要一些关于如何正确设置数据库表的指导(例如,关键库存字段应该是现有表的一部分还是其他表的一部分)以最好地处理循环密钥库存方案。

这是我想出的表格:

Customer_tbl(现有表)
• 客户ID
• KeyQTY(新字段?)
• KeyLabel(新字段?)

Employee_tbl(现有表)
• 员工ID
• Fn
• 升

KeyJournal_tbl(新表)
• 期刊ID
• 行动日期
• ActionPerformedID(密钥问题、密钥返回、密钥丢失等)
• 客户ID
• 员工ID
• 库存(从客户处收到的钥匙总数 - 还是应该在 Customer_tbl 下?)
• 问题返回日期

KeyInventory_tbl(新表)
• 密钥
• 客户ID
• KeyTotal

注意:我添加的 SQL Server 2005 标签仅供参考。如果该标签具有误导性,我不需要 SQL 语句方面的帮助。

【问题讨论】:

    标签: sql-server-2005 database-design


    【解决方案1】:

    我的倾向与你的很接近。这里:

    Customer
      customer_id
      name, address, etc, whatever reference info you need
    
    Employee
      employee_id
      name, etc
    
    KeyInventory
      key_id
      description
      customer_id
      qty
    
    KeyCheckout
      employee_id
      key_id
      checkout_date
      return_date
    

    注意事项:

    我对 KeyInventory 进行了描述,因为我假设您可以为客户提供多个密钥,并且您需要区分它们,例如“Apt 1”和“Apt 2”,或“仓库”和“办公室” .

    当给员工一个密钥时,创建一个 KeyCheckout 记录,其中包含给定日期。钥匙归还时,填写归还日期。如果返回日期为空,则密钥仍然存在。

    查找哪些员工拥有客户@cx 的密钥:

    选择employee_id 来自 KeyCheckout c 在 i.key_id = c.key_id 上加入 KeyInventory i 其中 i.customer_id = @cx 并且 c.return_date 为空

    要查找仍有多少密钥 @kx 可用:

    选择 i.qty - count(c.employee_id) 来自 KeyInventory 我 在 c.key_id=i.key_id 和 c.return_date 上加入 KeyCheckout c 不为空 其中 i.key_id = @kx

    等等

    你肯定想要一个关于 return_date 的索引,或者 KeyCheckout(key_id,return_date) 和 KeyCheckout(employee_id,return_date),因为这个表会变得非常大,如果没有索引,查询会变得非常慢。

    我认为您的 Journal 表与我的 Checkout 的概念相似。我只是将结帐和返回字段放在一个记录中,以便更容易确定密钥是否仍然存在。进出有单独的记录,你必须把它们匹配起来,这很痛苦。

    不要将数量放入日志类型的记录中。这不是“交易”的属性,而是密钥本身的属性。它属于库存表。

    不要将关键数量放在客户记录中。如果您需要知道客户拥有多少个不同的密钥,只需从 keyinventory where customer_id=@cx 中选择 count(*)。将此计数存储在客户记录中只会产生与关键记录的实际数量不匹配的可能性。

    我不确定“keylabel”是什么。如果这是对密钥的描述,则它属于 KeyInventory 记录,因为客户可能拥有多个密钥。我认为说客户只能拥有一把钥匙是没有意义的。即使您今天的客户碰巧是这样,但将来客户可能拥有多个密钥,也不妨允许这样做。

    我认为您的库存是非序列化的,即同一把锁的 3 把钥匙没有区别,只是“数量 3”,对吗?如果他们有单独的序列号或其他东西,那么就不会有数量字段,并且每个键都有单独的记录。

    【讨论】:

    • 您的回复正是我希望但没想到的那种回复。你的解释很有道理,你对Don't put the qty into a journal-type record. That's not an attribute of the "transaction", it's an attribute of the key itself. It belongs in the inventory table. 的陈述真的把它带回家了。我使用的是KeyLabel,而您使用的是description,非常感谢您写下详细的答案并花时间这样做。
    • 这比在网页上固定间距更有趣,这是我应该做的!
    猜你喜欢
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    相关资源
    最近更新 更多