首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >随机相对于表的设计

随机相对于表的设计
EN

Stack Overflow用户
提问于 2016-08-26 21:00:00
回答 1查看 39关注 0票数 0

我正在开发一个应用程序,它可以创建两种类型相同的事物的随机“战斗/对抗”。比方说,它是关于汽车及其功能的,例如:

会有许多功能,与安全,舒适等相关的东西。

汽车A将有一个安全功能,安全气囊,汽车B,它将是ABS和空调和汽车C加热座椅。

现在我要存储一张清单:安全气囊与ABS,加热座椅与空调。请注意,我不能做安全气囊和加热的座位。

我想出了两个办法使这件事成功。

用户

代码语言:javascript
运行
复制
id | username

汽车

代码语言:javascript
运行
复制
id | name 

群组

代码语言:javascript
运行
复制
id | name

特性

代码语言:javascript
运行
复制
id | car_id | group_id | value

对比

第一版

代码语言:javascript
运行
复制
id | user_id | group_id | car_a_id | car_b_id | winner_id

第二版

代码语言:javascript
运行
复制
id | user_id | feature_a_id | feature_b_id | winner_id

现在,对于第一个版本,我必须使用car_a_idcar_b_idgroup_id来获取features,但这确保了我不会比较不在同一组中的特性。问题是,如果任何功能被删除,我将有一个无效的相对,我不会知道,直到我真正获取这些特性。

第二个版本解决了这个问题,因为我只需在外键中添加一个ON DELETE CASCADE。但是,现在我必须确保行的每个特性在获取它们时都在同一组中(我不能依赖于以下事实,即指定的变量列表实际上是有效的)。

现在我不喜欢这两种解决方案,我觉得我做错了什么,但是我找不到更好的了。

有没有更好/更简单的方法来做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-28 18:22:12

我在上面作了评论,但想发布一些解决方案。

如果“is”是功能比较的直接特性,则需要直接引用“is”中的特性。这在您的“第二个版本”中得到了显示。

听起来,主要关注的是确保“is”中的两个特性都属于同一组。您可以通过几种不同的方式来完成这一任务。

  1. 消除用户通过UI或其他代码比较不同组中的功能的选项。例如,当用户选择要比较的功能时,下拉框仅显示单个组中的功能。
  2. 还可以尝试在postgresql表约束中使用子查询或函数。我从来没有做过这样的事情(我也不会推荐它),但是它可能适合您特定的应用程序需求。http://grokbase.com/t/postgresql/pgsql-general/052h6ybahr/checking-of-constraints-via-subqueries
  3. 您可以将这两个特性的group_id存储在“of”表中。这显然违反了规范化规则,但如果您无法控制调用代码,并且需要确保组之间不发生冲突,则可以创建一个简单的约束,使"feature1_group_id“==”feature2_group_id“。这不是一个健壮的方法,我不推荐它,但这是另一种选择。

总之,我认为您需要与UI进行协调,以确保用户在比较特性时不会违反组成员约束(解决方案1)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39174557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档