在开发数据库逻辑方面需要帮助
Need help in developing DB logic
这是我的一个小项目 - 航空公司预订系统 - 我们称这家航空公司为 FlyMi :我有一个数据库(还没有决定使用哪个,我的朋友想用 MongoDB)。
Anyhoo,这是我的要求:
我有一个 table,其中包含航班的详细信息 - 航班号、时间表等。我将使用此 table 执行各种操作 - 预订、取消、修改
这就是我卡住的地方:对于桌面应用程序和 Web 应用程序 - 我提供 select 个席位的选项。这意味着我必须跟踪哪些座位已预订,哪些未预订。假设我有一个 UI ,它将座位显示为
Red - Booked
Green - Not Booked.
所有这些 - 对于每个和每一个航班。我的问题是:对于该航空公司的每个航班,您认为跟踪座位预订的最有效方式是什么?
当前想法: 保留一名 table 指定乘客 - 包含姓名、地址等所有详细信息,以跟踪所有乘客,并维护一名 乘客ID 这样,前 4 个字符是航班 ID,最后 2 个字符是他们选择的座位号,中间是随机数(我说随机是因为我认为它在这里并不重要)。因此,对于任何航班,如果我必须找出未预订座位的数量,我将不得不扫描每一位乘客,谁已经预订,谁已经预订了该航班。我认为这真的很低效。为我提供执行此操作的最有效逻辑。
不要使用“智能键”。
这是一个叫做“智能密钥”或“在密钥中编码信息”的坏主意。
见 which contains this excerpt:
Despite it now being easy to implement a Smart Key, it is hard to recommend that you create one of your own that isn't a natural key, because they tend to eventually run into trouble, whatever their advantages, because it makes the databases harder to refactor, imposes an order which is difficult to change and may not be optimal for your queries, requires a string comparison if the Smart Key includes non-numeric characters, and is less effective than a composite key in helping range-based aggregations. It also violates the basic relational guideline that every column should store atomic values
Smart Keys also tend to outgrow their original coding constraints
(请注意,座位位置通常由智能键标识,因为它们是行号和跨行计数。但它们通常也明显地物理永久地固定在该编队中。想象一下,如果它们被标记和重新排列。)
自学数据库设计。
请用最直截了当的术语描述您的业务。这就是关系模型数据库和 DBMS 的工作方式。
找到足够的填空句模板来描述您的业务情况:
"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"
...
对于每个这样的参数化句子模板(aka predicate)都有一个基础 table,其中 blanks/parameters 的名称是列名称。 table 中的每一行都陈述了语句 (proposition) 是根据其列值填空得到的;不在 table 中的每一行都声明不是根据其列值填充空白的语句。
然后为每个 table 找到每个 功能依赖性 (FD)。 (当谓词可以用“... AND column = F(column1,...)”的形式表达时,我们说列集 {column1,...} 在功能上确定 列 column 并且 FD 集合 → column holds.) 然后识别每一个候选键 (CK)。 (superkey 是一个列集,它在功能上确定每一列。即 unique,即这些列的每个值子行仅出现在table 的一行。CK 是一个不包含较小超级键的超级键。)然后找到每个 join dependency (JD)。 (有些谓词对一些 AND 和“...”说“... AND ...”。当每个谓词“...”的 table 看起来像你的样子时,就有一个 JD从仅从原始 table 中获取其列。)请注意,每个 FD 都带有关联的(二进制)JD。
然后规范化你的table到第五范式 (5NF)。这意味着分解(即替换table,其中JD“...和...”由tables替换,其谓词是“... "s) 直到每个持有的 JD 被 CKs 暗示 (即当来自 CKs 的 FD 的 JDs 持有时 必须 持有。)(出于性能原因,还可以通过组合不在 5NF 中的基础 table 来 非规范化 。)
见 and this one。
然后我们通过描述我们想要的行来查询。我们通过将基础 table 谓词与逻辑运算符(即 AND、OR、NOT、FOR SOME、FOR ALL 等)和函数调用连接起来来为我们想要的 tables 提供谓词来做到这一点 and/or 通过关系运算符(即 JOIN、UNION、MINUS/EXCEPT、PROJECT/SELECT、RENAME/AS)连接基础 table 名称来给出 table 的值我们想要 and/or 两者(例如 RESTRICT/WHERE)。
两个 table 的 JOIN 包含从它们的谓词的 AND 中做出真实陈述的行,即具有作为谓词的谓词;和 UNION OR,MINUS/EXCEPT AND NOT;并且 table 的 PROJECT/SELECT columns 在其谓词之前放置了 FOR SOME all-other-columns ; and RESTRICT/WHERE 在它的谓词后面加上 AND condition;并且 列 的 RENAME/AS 在其谓词中重命名该参数。所以一个 table 表达式对应于一个谓词:一个 table (base table 或查询结果)值包含从它的(base table's或查询表达式的)谓词。
见this answer。
约束也是如此,它们是真实的陈述,它们共同描述了应用程序情况和数据库状态,而不是给定可能出现的情况和基础table 谓词。
参见 this answer。
这是我的一个小项目 - 航空公司预订系统 - 我们称这家航空公司为 FlyMi :我有一个数据库(还没有决定使用哪个,我的朋友想用 MongoDB)。
Anyhoo,这是我的要求: 我有一个 table,其中包含航班的详细信息 - 航班号、时间表等。我将使用此 table 执行各种操作 - 预订、取消、修改
这就是我卡住的地方:对于桌面应用程序和 Web 应用程序 - 我提供 select 个席位的选项。这意味着我必须跟踪哪些座位已预订,哪些未预订。假设我有一个 UI ,它将座位显示为
Red - Booked
Green - Not Booked.
所有这些 - 对于每个和每一个航班。我的问题是:对于该航空公司的每个航班,您认为跟踪座位预订的最有效方式是什么?
当前想法: 保留一名 table 指定乘客 - 包含姓名、地址等所有详细信息,以跟踪所有乘客,并维护一名 乘客ID 这样,前 4 个字符是航班 ID,最后 2 个字符是他们选择的座位号,中间是随机数(我说随机是因为我认为它在这里并不重要)。因此,对于任何航班,如果我必须找出未预订座位的数量,我将不得不扫描每一位乘客,谁已经预订,谁已经预订了该航班。我认为这真的很低效。为我提供执行此操作的最有效逻辑。
不要使用“智能键”。
这是一个叫做“智能密钥”或“在密钥中编码信息”的坏主意。
见
Despite it now being easy to implement a Smart Key, it is hard to recommend that you create one of your own that isn't a natural key, because they tend to eventually run into trouble, whatever their advantages, because it makes the databases harder to refactor, imposes an order which is difficult to change and may not be optimal for your queries, requires a string comparison if the Smart Key includes non-numeric characters, and is less effective than a composite key in helping range-based aggregations. It also violates the basic relational guideline that every column should store atomic values
Smart Keys also tend to outgrow their original coding constraints
(请注意,座位位置通常由智能键标识,因为它们是行号和跨行计数。但它们通常也明显地物理永久地固定在该编队中。想象一下,如果它们被标记和重新排列。)
自学数据库设计。
请用最直截了当的术语描述您的业务。这就是关系模型数据库和 DBMS 的工作方式。
找到足够的填空句模板来描述您的业务情况:
"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"
...
对于每个这样的参数化句子模板(aka predicate)都有一个基础 table,其中 blanks/parameters 的名称是列名称。 table 中的每一行都陈述了语句 (proposition) 是根据其列值填空得到的;不在 table 中的每一行都声明不是根据其列值填充空白的语句。
然后为每个 table 找到每个 功能依赖性 (FD)。 (当谓词可以用“... AND column = F(column1,...)”的形式表达时,我们说列集 {column1,...} 在功能上确定 列 column 并且 FD 集合 → column holds.) 然后识别每一个候选键 (CK)。 (superkey 是一个列集,它在功能上确定每一列。即 unique,即这些列的每个值子行仅出现在table 的一行。CK 是一个不包含较小超级键的超级键。)然后找到每个 join dependency (JD)。 (有些谓词对一些 AND 和“...”说“... AND ...”。当每个谓词“...”的 table 看起来像你的样子时,就有一个 JD从仅从原始 table 中获取其列。)请注意,每个 FD 都带有关联的(二进制)JD。
然后规范化你的table到第五范式 (5NF)。这意味着分解(即替换table,其中JD“...和...”由tables替换,其谓词是“... "s) 直到每个持有的 JD 被 CKs 暗示 (即当来自 CKs 的 FD 的 JDs 持有时 必须 持有。)(出于性能原因,还可以通过组合不在 5NF 中的基础 table 来 非规范化 。)
见
然后我们通过描述我们想要的行来查询。我们通过将基础 table 谓词与逻辑运算符(即 AND、OR、NOT、FOR SOME、FOR ALL 等)和函数调用连接起来来为我们想要的 tables 提供谓词来做到这一点 and/or 通过关系运算符(即 JOIN、UNION、MINUS/EXCEPT、PROJECT/SELECT、RENAME/AS)连接基础 table 名称来给出 table 的值我们想要 and/or 两者(例如 RESTRICT/WHERE)。
两个 table 的 JOIN 包含从它们的谓词的 AND 中做出真实陈述的行,即具有作为谓词的谓词;和 UNION OR,MINUS/EXCEPT AND NOT;并且 table 的 PROJECT/SELECT columns 在其谓词之前放置了 FOR SOME all-other-columns ; and RESTRICT/WHERE 在它的谓词后面加上 AND condition;并且 列 的 RENAME/AS 在其谓词中重命名该参数。所以一个 table 表达式对应于一个谓词:一个 table (base table 或查询结果)值包含从它的(base table's或查询表达式的)谓词。
见this answer。
约束也是如此,它们是真实的陈述,它们共同描述了应用程序情况和数据库状态,而不是给定可能出现的情况和基础table 谓词。
参见 this answer。