为了让这个问题对未来的读者有用,我将使用通用数据模型来说明我面临的问题。
我们的数据模型由 3 个实体组成,它们应标记为A
、B
和C
。为了简单起见,它们的所有属性都将是int
类型。
实体A
具有以下属性:D
,E
和X
;
实体B
具有以下属性:D
,E
和Y
;
实体C
具有以下属性:D
和Z
;
由于所有实体共享公共属性D
,我决定应用类型/子类型设计。
重要提示:实体是互斥的!这意味着实体是 A 或 B 或 C。
实体A
和B
还有另一个共同的属性E
,但是这个属性并不存在于实体中C
。
如果可能的话,我想使用上述特性来进一步优化我的设计。
老实说,我不知道如何做到这一点,也不知道从哪里开始尝试,因此这篇文章。
下面的例子说明了我面临的问题:
动物有一个种族,可以是猫或狗。猫可以是Siamese或Persian。狗可以是德国牧羊犬或拉布拉多猎犬。
Animal 是一个强大的实体,而其种族是一个属性,可以具有两个提供的值之一( cat 或 dog )。 这两个值都很复杂(我在这里只添加了狗/猫的类型来说明问题,但也可以有猫/狗的名字和一堆其他东西)。
我不知道如何为此示例创建关系表。
我曾尝试使用陈的符号绘制 ER 图,这代表了问题,但作为初学者,我不知道我是否做得对。这是我得到的:
如果我画错了,我深表歉意,如果是这样,请纠正我。我不希望简单地获得“免费解决方案”,而且还希望学习如何处理这个问题,以便我将来可以自己解决。
我唯一想到的是创建两张单独的桌子,一张给猫,一张给狗。此外,Animal表中的race属性将只存储cat或dog值。像这样的东西:
Animal< # Animal_ID, race, other attributes >
Cat < # Cat_ID, $ Animal_ID, breed >
Dog < # Dog_ID, $ Animal_ID, breed >
Run Code Online (Sandbox Code Playgroud)
我真的对我的解决方案有一种不好的感觉,我担心它是错误的,因此下面的问题。
如果需要更多信息,请发表评论,我会尽快更新我的帖子。也可以随意添加适当的标签,因为我在这里很新。
谢谢你。
假设我有一张表,用于存储一个人的身高和体重,如下所示:
PersonTable < # ID int, Name varchar(50), Height double, Weight double >
Run Code Online (Sandbox Code Playgroud)
身高以厘米为单位,体重以公斤为单位。
我的问题是关于存储身高和体重的计量单位。
PersonTable < # ID int,
Name varchar(50),
Height double, $ HeightUnit_Id int,
Weight double, $ WeightUnit_Id int >
Units < #ID int, Desription varchar(20) >
Run Code Online (Sandbox Code Playgroud)
HeightUnit_Id 和 WeightUnit_Id 是引用表 Units 中的 Id 的外键。
有没有比我上面提到的明显解决方案更好的解决方案,因为我不喜欢两者(如果做得不好,EAV 会变得混乱,并且添加额外的“单位列”对我来说似乎是浪费空间)?
为了让这个问题对未来的读者有用,我将使用通用数据模型来说明我面临的问题。
我们的数据模型由两个实体组成,它们应标记为A
和B
。为了简单起见,它们的所有属性都将是int
类型。
实体A
具有以下属性:D
和X
;实体B
具有以下属性:D
和Y
;
由于两个实体共享共同的属性D
,我决定应用类型/子类型设计。
我不确定我的实现是否正确,因此我在这里要求进行设计审查。
-- lookup table for discriminator column
CREATE TABLE ClassType
(
ClassTypeID INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
Class_Description VARCHAR(50) NOT NULL
);
-- inserting types A and B from our example
INSERT INTO ClassType (Class_Description)
VALUES ('A'), ('B');
-- creating base class table
CREATE TABLE BaseClass
(
BaseClass_ID INT …
Run Code Online (Sandbox Code Playgroud) 我正在为考试设计数据库,但我被卡住了。我不知道怎么做。
以下是相关信息:
我需要数据库设计方面的帮助。
到目前为止我自己尝试过的:
ID bigint (primary key, identity)
Name nvarchar(MAX)
Run Code Online (Sandbox Code Playgroud)
ID bigint (primary key, identity)
TextOfTheQuestion nvarchar(MAX)
Run Code Online (Sandbox Code Playgroud)
ID bigint (primary key, identity)
TextOfTheAnswer nvarchar(MAX)
QuestionID bigint (foreign key to Questions.ID)
isCorrectAnswer bit
Run Code Online (Sandbox Code Playgroud)
StudentID bigint (primary key, foreign key to Students.ID)
AnswerID bigint (primary key, foreign key to Answers.ID)
Run Code Online (Sandbox Code Playgroud)
这是我个人为学习目的而设计的。我正在尝试自己学习实体框架 + C#。