对不起那个noob问题,但有没有真正需要与数据库中的表一对一的关系?您可以在一个表中实现所有必需的字段.即使数据变得非常大,您也可以在SELECT语句中枚举所需的列名而不是使用SELECT *.你什么时候真的需要这种分离?
我正在寻找关于设计围绕版本化数据的数据模型的最佳方法的一些输入.将存在一对多和多对多关系,这些关系可以在不同版本之间发生变化.
我正在寻找一些不同的策略,最终目标是进行有效的比较,如果可能的话,只存储delta.
假设我有两个表(苹果和橘子)具有相同的列和只是一个不同的表名称.是否有任何优点/缺点将其转换为一个表(简称其称为Fruit),并附加一个列'type',然后存储Apple或Orange的值?
编辑澄清:
CREATE TABLE apples(id int,weight int,variety varchar(255))
CREATE TABLE oranges(id int,weight int,variety varchar(255))
要么
CREATE TABLE fruit(id int,weight int,varchar(255),type ENUM('apple','orange'))
我的应用程序具有可属于组的用户的通知设置.组管理员可以定义整个组的设置,以便在任何用户执行操作时,将通知管理员.管理员还可以定义单个用户的设置,这将覆盖组设置.
现在我有一个包含列的数据库:group_id, action1, action2, action3, ....这些操作是布尔值,用于确定当用户在其组中执行该操作时是否通知管理员.
我可以创建一个由User模型而不是Group模型拥有的单独的表,但是将完全相同的数据存储在一个完全独立的表中并保存更改group_id为user_id.
另一种选择是添加user_id到我已经拥有的表中,并允许空值group_id.在确定用户的通知设置时,应用程序将首先根据用户选择设置,然后回退到group_id非空的设置.这感觉效率低下,因为数据库中会有很多空值,但这对我来说肯定需要的工作量更少.
这种情况的设计是否比我描述的两种设计更有效?
我在关系数据库中有以下表:
[Sensor]
LocationId [PK / FK -> Location]
SensorNo [PK]
[AnalogSensor]
LocationId [PK/FK -> Sensor]
SensorNo [PK/FK -> Sensor]
UpperLimit
LowerLimit
[SwitchSensor]
LocationId [PK/FK -> Sensor]
SensorNo [PK/FK -> Sensor]
OnTimeLimit
[Reading]
LocationId [PK/FK -> Sensor]
SensorNo [PK/FK -> Sensor]
ReadingDtm [PK]
[ReadingSwitch]
LocationId [PK/FK -> Reading]
SensorNo [PK/FK -> Reading]
ReadingDtm [PK/FK -> Reading]
Switch
[ReadingValue]
LocationId [PK/FK -> Reading]
SensorNo [PK/FK -> Reading]
ReadingDtm [PK/FK -> Reading]
Value
[Alert]
LocationId [PK/FK -> Reading]
SensorNo [PK/FK -> Reading]
ReadingDtm …Run Code Online (Sandbox Code Playgroud) 我正在开发旅行管理应用程序.有问题的设计如下:
旅游中的每个人都被指定为旅行者.每位旅行者都有护照.现在,旅行者可以是主会员或子会员,具体取决于他是否是家庭主管.MainMember决定像TourPackage这样的东西,他的旅行家庭的总金额等.一个SubMember在旅行时依赖于MainMember.因此,如果删除了MainMember,则还必须删除其所有子成员.
所以,旅行者有护照.(一对一关系)旅行者是主会员或子会员.(Traveler-MainMember和Traveler-SubMember之间的一对一/一)MainMember可能有几个SubMembers.(一对多)子成员只有一个主要成员.(多到一个)
我目前的ERD如下.

如您所见,三个表 - Traveler,MainMember和SubMember - 形成了循环依赖.不过,我不确定它是否会伤害我的应用程序.如果我删除作为MainMember的Traveler,则1.删除Traveler中的记录.2.删除其相关的MainMember记录.3.删除依赖于MainMember的SubMember记录.4.删除子成员的旅行者记录.
虽然它似乎不是问题,但由于Traveler-MainMember删除将始终只删除Traveler-SubMember(s).不过,我对此感觉不好.
任何人都可以指导我更好的设计吗?
更新 -
在等待回复的同时,我根据@ Daveo的回复提出了另一种设计.基本上,Traveler包含自引用外键.SubMember记录将使用它来识别他们的父母.
这是ERD.

现在,正如@Branko指出的那样,我之前的设计中没有循环依赖问题,我想知道哪种设计更好?
另外,通过Hibernate实现哪种设计会更好?我认为第二种方法可能会在通过Hibernate实现时导致复杂性.
我还要感谢关于您喜欢的设计的实现模式(Hibernate实体中的继承等)的一些指示.
database-design erd circular-dependency hibernate-mapping class-table-inheritance
我有一个关于关系数据库中超级子类型设计的问题.如果我有一个带有两个子类型表的超类型,我会将超类型的PK与两个子类型表的PK相关联作为FK.假设我有这样的事情:
TypeID PK
ID PK TypeID FK
ID PK,FK
ID PK,FK
在数据库方面,我如何确保给定类型的超类型ID只被放入适当的子类型表中?例如,我不希望将带有类型A的超类型ID放入SubtypeB表中.有没有办法轻松防止这种情况发生在数据库端?我知道这可以在代码中处理,但如果代码有错误怎么办?或者,如果有人手动将错误的ID输入其中一个子类型表,该怎么办?我想我正在寻找一些让数据库方面无法实现这一目标的方法.
有任何想法吗?也许Supertype表上的PK应该是ID和TypeID组合,ID列上有唯一约束,以防止两种类型的记录都在SuperType表中...然后子类型表将具有组合ID和TypeID PK对TypeID的约束只能是适当的子类型表的类型?
让我们假设我有N个书店用于N书店.我必须在每个书店的单独表中保存有关书籍的数据,因为每个表都有不同的方案(列的数量和类型不同),但是所有Bookstores表都有相同的列集;
现在我想创建一个只有几列的"MasterTable".
| MasterTable |
|id. | title| isbn|
| 1 | abc | 123 |
| MasterToBookstores |
|m_id | tb_id | p_id |
| 1 | 1 | 2 |
| 1 | 2 | 1 |
| BookStore_Foo |
|p_id| title| isbn| date | size|
| 1 | xyz | 456 | 1998 | 3KB |
| 2 | abc | 123 | 2003 | 4KB |
| BookStore_Bar |
|p_id| title| isbn| publisher | Format | …Run Code Online (Sandbox Code Playgroud) 我关注的用户可以是"未经证实"或"已确认".后者意味着他们获得完全访问权限,前者意味着他们在主持人批准后待审.我不确定如何设计数据库来考虑这种结构.
我有一个想法是有两个不同的表:confirmedUser和unconfirmedUser非常相似,只是unconfirmedUser有额外的字段(例如"emailConfirmed"或"confirmationCode").这有点不切实际,因为当用户被接受时我必须复制所有信息(虽然我想它不会那么糟糕 - 不要期待繁忙的流量).
我想象的第二种方式是实际将所有用户放在同一个表中,如果需要,可以使用额外的"未经证实的"数据来获取表的密钥(也许还可以在用户表中添加"已确认"标志).
每种方法的缺点有哪些优点,是否有更好的方法来设计数据库?
我有一张表,其中包含有关不同类型事件的信息,这些信息可由民事和工人两类人员完成
所以对于他们每个人我有他们各自的表
civil{ civil_id, name, age,telephone...} the primary key is civil_id
worker{ worker_id, name, duty, department...} the primary key is worker_id
Run Code Online (Sandbox Code Playgroud)
然后事件表包含所有可能事件的列表
event {type_of_event} the primary key is type_of_event
Run Code Online (Sandbox Code Playgroud)
然后我计划将信息存储在其他表中
与事件类型,完成工作的人(工人或民事)
id event_type date person
-----------------------------------
1 type1 12-12-12 x
2 type1 05-12-10 y
3 type2 02-12-12 y
Run Code Online (Sandbox Code Playgroud)
现在,在这个设计,我不知道如何与人谁如果做的工作,我就只有一个什么样的人(又名公民)我想只有亲自领域的civil_id存放在这最后的表....但如何知道这是民用还是工人,我还需要其他中间表吗?