Classpass.com喜欢数据库设计

时间:2016-06-17 20:38:23

标签: mysql database-design relational-database database-schema

我正在努力创建像数据库设计一样的classpass。我是数据库设计的新手,有些事情对我来说并不是很好,如何实现它们,我无法理解。

您可以查看classpass示例:

编辑1:所以这就是这样的想法:每个城市都有多个社区/场所。

在阅读了spencer7593的评论之后,这里是我所提供的内容以及仍然不太清楚的事情:

First try

所以我不太确定的是:

  1. 我不确定如何存储场地/工作室地址和地理位置。具有定义id |的表Region是否更好?名字| parent_id并递归地存储城市和社区?或者为城市和社区添加外键约束?我应该将lan / lon存储到场地表,地址甚至是单独的位置表吗?我希望能够执行以下搜索:

    • 向我展示该社区或城市的场地
    • 显示位置半径为XX的场地
  2. 每个班级都应该有一个时间表,目前我不知道如何设计它。例如:纺纱类,Mo,We,Fr从上午9点到上午10点。我想要 能够进行如下查询:

    • 给我看场地,上面有关于莫
    • 的旋转课程
    • 或者向我展示纺纱,拳击等类别中的所有课程
    • 甚至向我展示提供纺纱课程的场地
  3. 我应该在这里创建一个额外的表格表吗?或者只是创建某种创建计划的视图?如果它是一个额外的表格,我该如何描述一周中每一天的开始,结束?

3 个答案:

答案 0 :(得分:2)

@Dimitar,

即使@rhavendc是正确的,这个问题也应该放在数据库管理员中,我会尽我所知地回答你的问题。

  
      
  1. 我不确定如何存储场地/工作室地址和地理位置。 [...]
  2.   

您可以通过在网络上搜索轻松找到地理位置。以MyGeoPosition为例。

  

我希望能够执行类似

的搜索      
  • 向我展示该社区或城市的场地。

您可以轻松完成此操作。有几种方法可以做到这一点,每种方式都需要对ERD设计进行一些调整。通过下面附带的示例,您可以运行查询以列出所有具有address_id后跟城市ID的场所。黄色实体是我为确保完整性而添加的实体。

例如:

Refined ERD v1

-- venue.name is using the "[table].[field]" format to help
-- the engine recognize where the field is coming from.
-- This is useful if you are pulling the fields of the
-- same name from different tables.
select  venue.name, city.name
from    venue    join
        address  using (address_id)    join
        city     using (city_id);

注意:您不必包含city_name。我只是把它扔在那里,所以你可以尝试看看所有匹配它的场地。

如果你想通过邻居来做,你必须通过在neighbor_id表中添加ADDRESS来调整我给你的ERD。我附上了下面的示例,您还必须添加neighborhood_id从那里,您可以运行这样的查询:

使用此ERD: Refined ERD v2

-- Remember the format from the previously mentioned code.
select  venue.name, neighborhood.name
from    venue        join
        address      using (address_id)    join
        neighborhood using (neighbor_id);

  
      
  • 显示位置半径为XX的场地
  •   

您可以使用Haversine's Formula从经度和纬度计算英里数,公里数等。

  
      
  1. 每个班级都应该有一个时间表,目前我不知道如何设计它。例如:纺纱类,Mo,We,Fr从上午9点到上午10点。我希望能够做如下查询:      
        
    • 给我看场地,上面有关于莫
    • 的旋转课程   
    • 或者向我展示纺纱,拳击等类别中的所有课程
    •   
    • 甚至向我展示提供纺纱课程的场地
    •   
  2.   

这可以从我在这里附带的任何一个ERD中轻松得出。在CLASS表中,我添加了一个名为parent_class_id的字段,该字段从同一个表中获取class_id。这使用递归,我知道这有点令人头疼。这种递归将允许具有指定父类的类显示在不同时间也提供类。

您可以通过这样做获得此结果:

-- Remember the format from the previously mentioned code.
select  class1.name, class1.class_id, class2.class_id
from    class as class1,
        class as class2
where   class1.parent_class_id = class2.class_id;

  
      
  • 甚至向我展示提供纺纱课程的场地
  •   

这可能是一个棘手的问题...如果你想知道哪些场地提供纺纱类,纺纱是其中一部分或类的名称,而不是一个类别,这很简单。

试试这个......

-- Remember the format from the previously mentioned code.
select  venue_id
from    venue    join
        class    using (venue_id)
where   class_name = 'spinning';

注意:请记住,大多数SQL语言在搜索文字时都区分大小写。您可以尝试使用where UPPER(class_name) = 'SPINNING'

如果类名可能在其名称中包含“旋转”以外的单词,请改为使用:where UPPER(class_name) like '%SPINNING%'

如果您想知道哪些类提供了旋转类,其中旋转是一个类别,那就是棘手的位置。我相信您必须使用子查询。

试试这个:

-- Remember the format from the previously mentioned code.
select  class_id
from    class             join
        class_category    using (class_id)
where   cat_id =          (select    cat_id
                           from      category
                           where     name = 'spinning');

同样,对于文字搜索,SQL引擎通常也很敏感。确保您的病例处于正确的上部或下部情况。

  
      
  1. 我应该在这里创建一个额外的表格表吗?或者只是创建某种创建计划的视图?如果它是一个额外的表格,我应该如何描述一周中每一天的开始,结束?
  2.   

是和否。你可以,但如果你能理解数据库系统中的递归,你就不必这样做了。

希望这会有所帮助。 :)

答案 1 :(得分:1)

实体关系建模。

实体是可以唯一标识的人,地点,事物,概念或事件,对业务很重要,我们可以存储有关的信息。

根据问题中的信息,一些被视为实体的候选人可能是:

工作室

上课

的评价

附近

城市

对于每个实体,唯一标识它的是什么?弄清楚候选键。

找出实体之间的关系和基数。 (与什么相关,有多少,必需或可选?)

studio是否与class相关?

studio可以有多个class吗?

工作室可以为零classes吗?

class可以与多个studio相关联吗?

neighborhood是否与零,一个或多个city

相关

studio可以与多个neighborhood相关联吗?

获得实体和关系后,获取分配给每个实体的属性非常简单。只需确保每个属性都依赖于密钥,整个密钥以及除密钥之外的所有内容。

答案 2 :(得分:0)

<强>第一

您的问题不适合在Stack Overflow张贴在此处,因为我认为最好将其发布在Database Administrators

<强> SECOND

以下是一些阅读信息,只是为了帮助您构建数据库:

  1. Data Modeling(它有点宽泛,但它更好)
  2. Logical Data Model(短而全面的)
  3. <强> THIRD

    基本上,在设计数据库时,您应首先了解系统中需要的所有数据,并将它们分组(如果需要)以使其变小。 将其标准化以减少数据冗余。

    示例

    我们假设表venue将是您的主表或系统中所有事务的中心。这样,venue可能包含例如branch的子数据,可能包含不同的分支位置...... branch也可能包含子数据,例如schedule,{{1}和/或teacher也可能彼此相关(子数据从另一个子数据中获取数据)......等等依赖表格。

    然后,您还可以创建独立的表,但仍然与其他表建立连接。例如class表,它可能包含邻居位置和主要场地位置(因此它应该从neighborhood表中获取所选场地的id)......等等等等与相关和独立的表格。

    注意

    请记住&#34; 一对一,一对多&#34;关系。如果数据将包含多种子数据,只需将它们分成不同的表。如果数据只包含(1)种子数据,则将其全部放在一个表中。