【问题标题】:Table designing and efficiency表设计和效率
【发布时间】:2018-04-25 20:30:52
【问题描述】:

我正在为我的大学作业在 oracle 12c 中设计一个数据库,并且在我的设计中达到了一个点,我无法获得太多关于它的信息。

我的任务场景

您已与一家英国互联网服务提供商签订合同,对他们的内部软件系统进行全面检修。该组织提供宽带、光纤连接、电话、IPTV 和 4G 连接以及一些特定的定制开发。客户群主要是通过他们的大学提供服务的学生。他们目前使用 MyISAM 数据库引擎选择的旧版 MySQL 数据库进行操作,因此没有合适的关系。

我的问题

在 RIPA 请求的情况下,存储的有关学生的所有信息,包括通过跟踪收集的所有信息,都应该可以作为单个查询访问。

RIPA 请求

基本上,RIPA 请求是指策略想要了解某个人在使用互联网、通话等时所做的一切。

我应该怎么做?在数据库中设计我的表时,我应该有一个单独的表来收集所有这些信息吗?例如,表中有一堆外键与学生所做的事情有关?

更新 以下是我的任务的其余部分,只是为了更多关于我的问题和好奇的信息。

互联网服务提供商对用户的要求如下:

学生

• 学生能够注册和购买他们大学量身定制的产品

• 学生能够在应用程序、网站、Intranet 和 IPTV 平台上查看公告板。

• 学生应为使用经常性产品付费。

• 应在使用互联网和电话时跟踪学生的活动。大学内的路由器将发出一个可配置的 REST API 查询,提供正在访问的 URL,以及有关学生和位置的详细信息。电话呼叫也通过可配置的 REST API 查询提供的电话号码、通话时长和时间进行跟踪。

• 电话需要适当的信用余额;电话连接的路由器将发出 API 请求,减少整个通话期间的通话信用余额。

• 学生可以在布告栏项目上制作 cmets,其他学生可以评论这些 cmets。

• 学生可以使用代金券来支付项目费用或降低项目成本,无论是固定金额还是成本的百分比。应保留所用代金券的记录。

• 应录制观看的电视内容以用于广告目的。 IPTV 系统将请求一个可配置的 API,该 API 将提供正在观看的频道、学生电子邮件和时间。

• 学生需要登录才能访问布告栏、宽带、电话、IPTV 和 4G 连接;这是在第一次登录后存储在个人设备上的。

• 能够通过即时消息、电话和电子邮件获得支持。

大学教职员工

• 大学应该能够添加布告栏项目。

• 大学应该能够控制提供给学生的产品,应该设置限制以确保大学不会过度销售可用的连接。

• 布告栏内容可以针对特定层,从特定大学开始,然后是大学内的宿舍,最后是自定义学生组(按课程、俱乐部等),这些组应由大学指定。

• 大学工作人员需要使用情况统计数据。

• 大学工作人员需要使用管理区域进行更改

互联网服务提供商员工

• ISP 应该能够管理连接限制

• 在 RIPA 请求的情况下,存储的有关学生的所有信息,包括通过跟踪收集的所有信息,都应该可以作为单个查询访问。

• ISP 通过电子邮件、电话和即时消息三种方式提供支持。支持电子邮件和回复在现有服务器上进行管理;这将发出一个可定制的 REST API 查询,该查询将提供学生电子邮件地址、电子邮件主题、电子邮件正文、日期和时间。电话通过桌面软件手动记录,包括打电话的学生的详细信息和查询的性质。即时消息记录在数据库中,用于管理即时消息系统。

• 应该可以创建供学生使用的代金券;这些代金券应受时间、使用人数和每个学生使用次数的限制。凭证应该可以通过随机代码访问。

• ISP 管理需要有关使用和销售的统计数据。

• 新产品在向学生展示之前必须经过 ISP 工作人员的批准

• ISP 员工应使用桌面软件进行任何更改。

包含以下可选扩展将使您获得更高的评分(请参阅评分标准 - 实施)。

• 房间维修——学生可以要求维修他们的房间。当他们登录到网站时,他们可以指定他们房间的问题。不需要提供房间号。

• 免费客人 WIFI - 客人可以注册免费使用 WIFI。客人需要提供家庭住址、电子邮件地址和电话号码。必须先确认电话号码,然后才能访问 WIFI,这是由现有服务器管理的,该服务器根据 REST API 请求发送短信,一旦确认,就会发出 REST API 查询。

【问题讨论】:

    标签: oracle database-design oracle12c


    【解决方案1】:

    一般来说,我会先根据您所知道的创建一个“纯”关系模型。然后,您可以查看是否需要采取任何巧妙的措施来满足特定的 RIPA 查询要求。

    您描述的实体是:

    • 系统有很多客户
    • 客户拥有一项或多项服务
    • 服务具有类型(宽带、电视、4G 等)
    • 一个服务有 0 个或多个可监控的事件
    • 事件有一个类型(打电话、看电视节目、请求 URL 等)
    • 一个事件有数据;每种事件类型都有不同的数据架构

    可能还有很多其他有趣的东西要建模 - 计费数据等 - 但你的场景没有提到它们,所以我不会担心它们。

    如果上面的实体是正确的,那么你的架构就很明显了:

    Customer
    -----------------
    CustomerID (PK)
    Name
    ...
    
    Service
    --------------
    ServiceID (PK)
    Name
    Type
    .....
    
    CustomerService
    --------------------------
    CustomerID (FK)
    ServiceID (FK)
    
    
    Event
    -------------------------
    CustomerID (FK)
    ServiceID (FK)
    Type
    Date
    Event_Data
    

    剩下的挑战是“我们如何存储事件数据”?由于您没有指定除“列出它”之外的任何要求,我建议使用文本字段来存储原始数据,或使用 XML/JSON 来允许更智能的查询(例如“查找有人开始观看 Homeland 的所有事件IPTV") - 但由于您没有指定此要求,您可能不需要这样做。

    您的 RIPA 查询将类似于:

    select customer.*, 
           service.*, 
           customer_service.*,
           event.*
    from customer
    inner join customer_service on customer.customerID = customer_service.customer_id
    inner join service on customer_service.service_id = service_service_id
    inner join event on customer.customer_id = event.customer_id
    inner join event on service.service_id = event.service_id
    where customer_id = ?
    

    【讨论】:

    • 你说得对,当你说这可能还有很多其他有趣的东西要建模时——计费数据等,但我觉得在这里发布完整的作业不太合适。您回答中的可视化让我很容易找到自己的脚并设计这个数据库,最后的查询是一个很大的好处。我将通过 JSON 连接到我尚未设计的前端。
    【解决方案2】:

    您可以有一个表来维护用户,另一个来维护服务。然后是另一个表来映射用户和服务。

    这将允许您轻松添加/更新/删除服务。可以通过使用标志将服务标记为非活动来完成删除。这将允许保留旧数据,而新数据不会使用这些服务。

    更新: 您的用户表和服务表不会通过键直接相互链接。原因是您在用户和服务之间有多对多的关系。一个用户可以有很多服务,每个服务可以被很多用户使用。

    相反,UserServiceMap 表将用户 ID 和服务 ID 作为外键。在获取数据的同时,可以连接三个表,得到结果。映射表应该有自己的主键,而不是使用复合键。这将帮助用户停止和重新启动服务。

    【讨论】:

    • 我将查看用户表和将映射用户 + 服务的表之间的一对一关系,以及服务和映射表之间的相同一对一关系,这就是你说什么?
    猜你喜欢
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2012-02-07
    • 1970-01-01
    相关资源
    最近更新 更多