假设我们有以下表结构:
人类
| HumanID | FirstName | LastName | Gender | |---------+-----------+----------+--------| | 1 | Issac | Newton | M | | 2 | Marie | Curie | F | | 3 | Tim | Duncan | M |
动物
| AmimalID | Species | NickName | |----------+---------+----------| | 4 | Tiger | Ronnie | | 5 | Dog | Snoopy | | 6 | Dog | Bear | | 7 | Cat | Sleepy |
我想知道如何在其他表中引用一组记录。
例如,我有一个Foods表和一个EatenBy列。
食品
| FoodID | FoodName | EatenBy | |--------+----------+---------| | 8 | Rice | ??? |
我想在EatenBy中存储的内容可能是
一个简单的解决方案是使用连接字符串,其中包括来自不同表的主键和特殊字符串,如“Humans”,“M”。应用程序可以解析连接的字符串并相应地执行操作。
食品
| FoodID | FoodName | EatenBy | |--------+----------+--------------| | 8 | Rice | Humans, 6, 7 |
我知道从关系数据库设计的角度来看,使用串联字符串是一个坏主意。
另一种选择是添加另一个表并使用外键。
食品
| FoodID | FoodName | |--------+----------| | 8 | Rice |
EatenBy
| FoodID | EatenBy | |--------+---------| | 8 | Humans | | 8 | 6 | | 8 | 7 |
我认为它比第一个解决方案更好。问题是EatenBy字段存储了不同含义的值。那是问题吗?
模拟此要求的最佳方法是什么?在这种情况下如何实现3NF?
这里的示例表有点人为,但我确实在工作中碰到这样的情况。我看过很多表只使用连接字符串。我认为它很糟糕但却无法想出一种更为关联的方式来处理它。
对于那些想快速了解这个问题的答案的人。这是基本的想法:
解决问题的想法很好。但是,这里的数据模型很糟糕。
明显的问题:
就目前而言,你的问题无法回答。因此......这不是答案,这是方向,以便您在问题中添加相关详细信息,以便我们提供答案。请不要对此投票。
你可能在工作中看到过类似的东西,但这并不意味着它是正确的,或者是可接受的。 CSV打破2NF。您无法轻松搜索该字段。您无法轻松更新该字段。您必须通过代码手动管理内容(例如,避免重复;排序)。你没有数据库或任何类似的数据库,你有一个宏大的记录文件系统,你必须编写大量的代码来“处理”。就像1970年ISAM数据处理过去的糟糕时期一样。
因此,我会请你:
ID
列,完全和完全EatenBy
EatenBy
就是这样,但它不是,因为数据还没有组织,形成关系。)如果我看着我的水晶球,大部分都是黑暗的,但是从我能看到的小小的光斑中,它看起来像你想要的:
事物是名词,主题。最终我们将在这些主题之间做一些事情,那就是动词或动作声明。这将形成谓词(一阶逻辑)。但现在不是,现在,我们只想要东西。
现在,如果您可以修改您的问题,并告诉我更多关于您的事物及其含义的信息,我可以为您提供完整的数据模型。
如果需要关系数据库,则需要关系密钥,而不是记录ID。此外,使用标记在每个文件上的ID启动数据建模练习会削弱练习。
请阅读this Answer。
如果您想要完整的话语,请提出一个新问题。这是一个快速摘要。
层次结构在世界上自然发生,它们无处不在。这导致层次结构在许多数据库中实现。关系模型建立在层次模型的基础上,并且是层次模型的一个进步。它极好地支持层次结构。不幸的是,着名的作家并不了解RM,他们只教导20世纪70年代以前的唱片归档系统被标记为“关系”。同样,他们不了解层次结构,更不用说RM中支持的层次结构,因此他们会对其进行抑制。
结果是,必须实现的无处不在的层次结构不被如此识别,因此它们以非常不正确且大规模低效的方式实现。
相反,如果正在建模的数据中出现的层次结构正确建模,并使用真正的Relational构造(关系键,规范化等)实现,那么结果是一个易于使用且易于编码的数据库,以及没有数据重复(任何形式)和极快。它的字面意思是最好的关系。
数据中出现三种类型的层次结构。
Domain::Animal::Harvest
Domain::Activity::Harvest
请注意,Hidders不知道数据是一个层次结构;他的RFS没有正确的完整性,因为它不是关系型的;将数据放在Relational上下文中提供了他在其外部寻求的完整性;关系模型消除了所有这些“问题”,并使所有这些“解决方案”变得可笑。
这是another example,虽然建模尚未完成。请务必检查谓词,并在第2页查看实际的密钥。层次结构是:
Subject::CategorySubject::ExaminationResult
Category::CategorySubject::ExaminationResult
Person::Registrant::Candidate::ExaminationResult
请注意,最后一个是业务工具状态的进展,因此Key不会复合。 Message::Message[Message]::Message[::Message[Message]] ...
Part[Assembly]::Part[Component] ...
Part[Component]::Part[Assembly] ...
Person[Parent]::Person[Child] ...
Person[Child]::Person[Parent] ...
与数据中通常存在层次结构的事实分开,由于压制而无法识别它们,因此它们不是作为层次结构实现的,当它们被识别时,它们是在最荒谬的时候实现的。愚蠢的方式。
HIERARCHYID
数据类型做同样的事情。每次节点改变时,都会给你一大堆混凝土,这些混凝土必须经过锤击和重新浇注。好吧,它不是那么短暂。
对于每个吃食物的类别,您应该添加一个表。例如,如果一种食物可能被某些特定性别吃掉,您将拥有:
Food_Gender(FoodID,GenderID)
对于人类你会有:
Food_Human(FoodID,HumanID)
对于动物物种:
Food_AnimalSpc(FoodID,Species)
对于整个表:
Food_Table(FoodID,TableID)
等等其他类别