我正在努力创建像数据库设计一样的classpass。我是数据库设计的新手,有些事情对我来说并不是很好,如何实现它们,我无法理解。
您可以查看classpass示例:
编辑1:所以这就是这样的想法:每个城市都有多个社区/场所。
在阅读了spencer7593的评论之后,这里是我所提供的内容以及仍然不太清楚的事情:
所以我不太确定的是:
我不确定如何存储场地/工作室地址和地理位置。具有定义id |的表Region是否更好?名字| parent_id并递归地存储城市和社区?或者为城市和社区添加外键约束?我应该将lan / lon存储到场地表,地址甚至是单独的位置表吗?我希望能够执行以下搜索:
每个班级都应该有一个时间表,目前我不知道如何设计它。例如:纺纱类,Mo,We,Fr从上午9点到上午10点。我想要 能够进行如下查询:
我应该在这里创建一个额外的表格表吗?或者只是创建某种创建计划的视图?如果它是一个额外的表格,我该如何描述一周中每一天的开始,结束?
答案 0 :(得分:2)
@Dimitar,
即使@rhavendc是正确的,这个问题也应该放在数据库管理员中,我会尽我所知地回答你的问题。
- 我不确定如何存储场地/工作室地址和地理位置。 [...]
醇>
您可以通过在网络上搜索轻松找到地理位置。以MyGeoPosition为例。
我希望能够执行类似
的搜索
- 向我展示该社区或城市的场地。
您可以轻松完成此操作。有几种方法可以做到这一点,每种方式都需要对ERD设计进行一些调整。通过下面附带的示例,您可以运行查询以列出所有具有address_id后跟城市ID的场所。黄色实体是我为确保完整性而添加的实体。
例如:
-- 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从那里,您可以运行这样的查询:
-- 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从经度和纬度计算英里数,公里数等。
- 每个班级都应该有一个时间表,目前我不知道如何设计它。例如:纺纱类,Mo,We,Fr从上午9点到上午10点。我希望能够做如下查询:
醇>
- 给我看场地,上面有关于莫
的旋转课程- 或者向我展示纺纱,拳击等类别中的所有课程
- 甚至向我展示提供纺纱课程的场地
这可以从我在这里附带的任何一个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 :(得分:1)
实体关系建模。
实体是可以唯一标识的人,地点,事物,概念或事件,对业务很重要,我们可以存储有关的信息。
根据问题中的信息,一些被视为实体的候选人可能是:
工作室
上课
的评价
附近
城市
对于每个实体,唯一标识它的是什么?弄清楚候选键。
找出实体之间的关系和基数。 (与什么相关,有多少,必需或可选?)
studio
是否与class
相关?
studio
可以有多个class
吗?
工作室可以为零classes
吗?
class
可以与多个studio
相关联吗?
neighborhood
是否与零,一个或多个city
?
studio
可以与多个neighborhood
相关联吗?
获得实体和关系后,获取分配给每个实体的属性非常简单。只需确保每个属性都依赖于密钥,整个密钥以及除密钥之外的所有内容。
答案 2 :(得分:0)
<强>第一强>
您的问题不适合在Stack Overflow张贴在此处,因为我认为最好将其发布在Database Administrators。
<强> SECOND 强>
以下是一些阅读信息,只是为了帮助您构建数据库:
<强> THIRD 强>
基本上,在设计数据库时,您应首先了解系统中需要的所有数据,并将它们分组(如果需要)以使其变小。 将其标准化以减少数据冗余。
示例强>
我们假设表venue
将是您的主表或系统中所有事务的中心。这样,venue
可能包含例如branch
的子数据,可能包含不同的分支位置...... branch
也可能包含子数据,例如schedule
,{{1}和/或teacher
也可能彼此相关(子数据从另一个子数据中获取数据)......等等依赖表格。
然后,您还可以创建独立的表,但仍然与其他表建立连接。例如class
表,它可能包含邻居位置和主要场地位置(因此它应该从neighborhood
表中获取所选场地的id
)......等等等等与相关和独立的表格。
注意强>
请记住&#34; 一对一,一对多&#34;关系。如果数据将包含多种子数据,只需将它们分成不同的表。如果数据只包含(1)种子数据,则将其全部放在一个表中。