需要帮助开发数据库逻辑

时间:2015-07-13 18:27:23

标签: database database-design logic database-schema memory-efficient

这是我的一个迷你项目 - 航空公司预订系统 - 我们打电话给这家航空公司FlyMi:我有一个数据库(没有决定哪一个,我的朋友想和MongoDB一起去)。

Anyhoo这是我的要求: 我有一张桌子上有飞行的详细信息 - 航班号,时间表等我打算用这张桌子进行各种操作 - 预订,取消,修改

这就是我陷入困境的地方:对于桌面应用程序和Web应用程序 - 我提供了一个选择席位的选项。这意味着我必须记录哪些座位被预订,哪些座位不被预订。并假设我有一个用户界面,显示座位为红色 - 预订的绿色 - 未预订。

所有这一切 - 对于每一个航班。我的问题是:您认为对于该航空公司的每个航班,最有效的跟踪座位预订的方式是什么?

当前构思:保留一张名为乘客的表格 - 包含所有详细信息,如姓名,地址等,以跟踪所有乘客,并保持乘客ID ,以便首先4个字符是航班ID,最后2个字符是他们选择的座位号,中间有随机数(我说随机因为我觉得这里不重要)。因此,对于任何航班,如果我必须找出未预订座位的数量,我将必须扫描已经预订的每位乘客,以及谁在该航班预订。我认为这非常有效。为我提供最有效的逻辑。

1 个答案:

答案 0 :(得分:0)

请勿使用“智能钥匙”。

这是一个坏主意,称为“智能钥匙”或“按键编码信息”。

请参阅包含this answerthis excerpt

  

尽管现在很容易实现智能钥匙,但很难建议您创建一个不是自然钥匙的自己的钥匙,因为它们最终会遇到麻烦,无论其优势如何,因为它使数据库难以重构,强加一个难以更改的订单,可能不适合您的查询,如果智能钥匙包含非数字字符,则需要进行字符串比较,并且在帮助基于范围的方面不如复合键有效聚合。它还违反了每列应存储原子值的基本关系准则

     

智能密钥也往往超出其原始编码约束

(请注意,座位位置通常由智能钥匙识别,因为它们是行数和行数。但它们通常也可以在物理上永久地用螺栓固定在那个阵列中。想象一下它们是否经过标记和重新排列。 )

自学数据库设计。

只需用最简单的术语描述您的业务。那就是关系模型数据库& DBMS工作。

找到足够的填充[named-]空白句子模板来描述您的业务情况:

"customer [cid] has name [firstname] [lastname]
    AND customer [cid] has a phone number [phonenumber] of type [type] ..."
"customer [cid] can use credit card #[card_no]"
"seat [seatid] is at row [row] and column [column]"
"seat [seatid] is booked"
"seat [seatid] is temporarily committed to an unfinished booking"
...

对于每个这样的参数化句子模板(又名谓词)都有一个基表,其中空格/参数的名称是列名。表中的每一行都说明了根据列值填充空白所得的语句(命题);不在表中的每一行都表明不是根据列值填充空白的语句。

然后为每个表找到所有功能依赖(FD)。 (当谓词可以用“... AND = F( column1 ,...)”的形式表示时,我们说列集{ column1 ,...} 在功能上确定 FD set→列保存。)然后识别每个候选人密钥(CK)。 (超级密钥是一个功能上确定每一列的列集。即唯一,即这些列的每个值的子列只出现在表的一行中。 CK是超级密钥,不包含较小的超级密钥。)然后找到每个连接依赖项(JD)。 (有些谓词对于某些AND和&“...”说“...... AND ...”。当每个谓词“......”的表看起来像你从服用中得到的东西时就有一个JD只有原始表中的列。)请注意,每个FD都带有一个关联的(二进制)JD。

然后将表格标准化第五范式(5NF)。这意味着分解(即用其谓词为“...”的表替换JD“... AND ...”所持有的表,直到每个持有的JD为 CKs隐含的(即当来自CK的FD中的JD保持时,必须保持。)(出于性能原因,也可以通过组合来非规范化不在5NF的基表。)

请参阅this answerthis one

然后我们通过描述我们想要的行来查询。我们通过将基表谓词与逻辑运算符(即AND,OR,NOT,FOR SOME,FOR ALL等)和函数调用连接起来来为我们想要的表提供谓词和/或通过关系运算符连接基表名来实现这一点(即JOIN,UNION,MINUS / EXCEPT,PROJECT / SELECT,RENAME / AS)给出我们想要的表和/或两者的值(例如RESTRICT / WHERE)。

两个表的JOIN包含从中产生真实语句的行,即具有谓词的谓词的AND;和UNION,MINUS / EXCEPT AND NOT;并且表的PROJECT / SELECT 在其谓词之前放置FOR SOME all-other-columns ;和RESTRICT / WHERE在其谓词之后放入AND condition ; 的RENAME / AS在其谓词中重命名该参数。因此,表表达式对应于谓词:表(基表或查询结果)值包含从其(基表或查询表达式)谓词生成true语句的行。

请参阅this answer

约束也是如此,它们是真实的语句,它们共同描述应用程序情况和数据库状态,而不是可能出现的情况和基表谓词。

请参阅this answer