问题标签 [class-table-inheritance]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
inheritance - 如何使用 Symfony2 将继承子实体设置为 UserInterface
我有一个继承的数据库模型,使用 symfony2 的“类表继承”模型。
Employee 是一个抽象类,顶级继承模型。
秘书是扩展员工的孩子。技术员也是扩展员工的孩子。
我正在构建一个应用程序,秘书可以在其中为技术人员管理一些事情,所以他们有一个带有一些表格等的管理面板。
SecretRepository 也是一个 UserProvider 接口,允许秘书通过应用程序进行身份验证。
我遇到的问题是身份验证查询不关心鉴别器......
身份验证 SQL 查询的调试
我只是不明白如何管理秘书和员工之间的关系?我应该手动包含从秘书到员工的外键吗?还是我应该手动处理身份验证查询中的鉴别器?
让我们看看我的模型的基础知识:
父类Employee
儿童班秘书
UserProviderInterface类SecretaryRepository
问题很简单,INNER JOIN 子句不正确,因为它不使用从秘书到员工的外键,而是使用直接 ID,也可以是技术人员 ID!
这是我的表的一些行的导出:
ruby - 可以将 Sequel 的 ClassTableInheritance 插件配置为存储模型名称以外的其他内容作为键吗?
我正在为我的项目使用class_table_inheritance Sequel 插件,并且我有以下模型:
我更愿意在我的 Account 表中设置一个名为“account_type”的列,该列是一个枚举,可能值为“Twitter”、“Facebook”和“Google”,以识别帐户的类型。
我不喜欢我的表中的列与我的模型类的名称相关联的想法。它直接将我与我正在使用的 ORM 联系起来,并防止更改模型名称。
有没有办法向 class_table_inheritance 插件提供符号到类名符号的键映射,就像能够提供类名符号到表名符号的表映射一样?
sql - 在表继承中强制执行排他性:复合外键与检查约束
我正在遵循 Jeff Smith 的“在 SQL Server 中实现表继承”中描述的技术(这似乎是实现这种结构的事实上的方法)。基表与其三个子类型表、、People
具有 1:0..1 关系。传统上,这是通过将子类型表的主键定义为基表的外键来完成的。Students
Teachers
Parents
为了在子类型之间强制执行排他性(防止同一个人同时是学生和教师),作者建议将PersonTypeID
持久计算列添加到每个子类型表中,并将其包含在基表的外键约束中。
但是,这种方法存在许多问题:
- 它在每个子类型表上浪费了额外的一列空间。
- 它需要对基表附加唯一约束。这会浪费更多空间(因为它将作为唯一索引实现)并减慢对基表的更新。
- 外键约束涉及对两列(而不是一列)的检查,从而减慢了对子类型表的更新。
我的假设是,最好通过标量函数使用检查约束来强制唯一性。这将消除额外列和唯一索引的浪费存储,加快对基表的更新,并有望在更新子类型表时获得与复合外键相同的性能。
有什么理由不应该使用这种方法吗?
symfony - Doctrine2 - 类表继承
类表继承用于扩展 Person,以允许添加 Employee 和 Dragon。
Person、Employee 和 Dragon 都可以拥有一个 Toys。
Person、Employee、Dragon 和 Toys 之间应该如何建立联系?
类表继承的优点似乎是可以在父实体(人)上设置关系,从而避免创建名为:PersonToy、EmployeeToy 和 DragonToy 的新实体。
如果可以编写代码以便在内部一切正常,那将是理想的$toy->setEmployee($employee)
,$toy->setDragon($dragon)
我认为它必须这样做setPerson()
。
另一方面,是否可以调用 $toy->getDragon() 和 $toy->getEmployee() 并获得 Dragon/Employee 而不是 Person
我知道实体玩具只与人有关系,但人可以扩展,因此是龙或雇员。
如果可能的话,如何做到这一点?
sql - 如果没有共享列,使用类表继承模式是否有意义?
我正在考虑创建一个类表继承架构,如下所述:http ://www.sqlteam.com/article/implementing-table-inheritance-in-sql-server
然而,我想要这个的原因似乎与大多数人所追求的不同。大多数人使用这种模式来共享不同类型所共有的列,例如将FirstName列放在一个普通的Person表中,而不是在Employee和Customer表中复制它。
但就我而言,除了键之外,实际上不会有任何共享列。我只想在我的每个子表中使用一个公共键,以便可以将其作为外键引用。例如,如果我希望每个人都有一个或多个电话号码,我可以只创建一个PhoneNumber表,该表引用公共Person表中的 ID;我不想有单独的EmployeePhoneNumber和CustomerPhoneNumber表。
鉴于没有共享列(除了键),类表继承是正确的模式吗?还是有另一种模式可以更好地满足我的需求?
[编辑]
在谷歌搜索之后,看起来多态关联是我想要的合适术语,它通常以这种方式实现。如果有人对此有什么要说的,我会将这个问题留待更长时间。
mysql - 具有 3 种用户的数据库模型
我正在考虑使用以下语句设计数据库的更好方法是什么:
- 有 3 种用户(3 个不同的角色)。
- 他们有一些共同的领域,但他们也有不同的领域。
解决方案 A:同一张表中的所有用户(根据他们的角色,一些用户会有空字段)。
解决方案 B:我将在其中添加用户及其角色的主表。此外,我将创建 3 个额外的表,我将在其中记录额外的字段(取决于表),并且每条记录都有一个与主表中的用户相关的 id。
解决方案 C:一个包含基本用户信息的主表和一个包含元数据用户信息的第二个表,其中每条记录表示用户的一个字段。它与WordPress相似
database - 分层数据库模型
我正在设计一个关于宠物的分类广告网站,其中包含 3 个(主要)类别的广告:
我面临的问题是所有 3 个广告类别都有一些共同点,但它们也有一些差异。
例如,类别 A、B 和 C 都有以下共同点:
但是,B 类广告不能归类为“正在寻找/出售”,而 B 和 C 类广告可以。此外,每个类别都有自己的子类别。例如,类别 A 将具有采用子类别和销售子类别,类别 C 将具有工作子类别和服务子类别。
他们还将具有一些不常见的属性,例如仅在 C 类中的薪水。
我已经开始将其作为实体属性值模型进行研究,但我有几个问题:
这会影响性能吗?因为用户应该能够根据一些独特的属性进行搜索。那么通过一张大表进行查询不会影响性能吗?
我的属性之一是“Animal”(A 和 B 独有),最初我想要一个 Animal 表和一个 Breed 表(类似于 Location 如何在分类数据库模型的自己的表中)。但我无法想象如何使用实体属性模型来做到这一点。
这是我想出的数据库设计:http: //i.imgur.com/jyV6Cjc.png
[更新]
在阅读类表继承后,它似乎比 EAV 模型更合适,所以我将 EER 更改为:http: //i.imgur.com/JWPjt23.png
Job Ads 和 Sale Ads 可以归类为“寻找/提供”,但属性不会有太多差异,可能只是它们的名称(例如价格与首选价格)。那么你认为有必要在这里添加另一个层次的继承吗,还是会很麻烦?
销售广告可以是出售宠物、收养宠物、申请收养、申请购买宠物。你认为我应该把这些分成两张表吗?收养和销售?属性不会有太大差异,可能只是一个不同的属性。
mysql - 我应该在 MySql 中为讲师和学生制作 1 个或 2 个表格吗?
我目前正在做一个项目,您可以在其中保存讲师和学生的详细信息。我不确定我应该使用一张桌子User
还是两张桌子Lecturer
和Student
.
当您以讲师身份登录时,您拥有作为项目组管理页面的特殊权限,在加载组页面时,学生将没有这些权限。在User
tbl中会有一个
status
注册栏,您可以在该页面选择成为学生或讲师并输入特殊的讲师代码。我正在将 PHP 与 mySql 一起使用。
总之,我应该User
为学生和讲师使用 1 个表格,还是有 2 个单独Student
的Lecturer
表格。
附加信息:1 门课程可以有很多讲师和学生,但 1 名学生有 1 门课程,而讲师有很多课程。
sql-server - 实体框架 TPT 继承与 ObjectType 鉴别器列
我正在使用实体框架作为我的数据库的 ORM。为了对继承建模,我的数据库使用 Table Per Type(又名 Class Table Inheritance)模式。实体框架确实支持 TPT 继承。但是它非常慢。它为最简单的 linq 查询生成非常复杂的选择查询。(见这篇文章)关于数据库继承的背景,这是一篇关于不同类型继承模式的好文章。
作为替代方案,我的数据库使用 TPT 模式的变体,其中包括当前对象的子类型。这是遵循这篇文章的建议。由于您知道要加入哪个子表,因此包括子表的类型应该会进行更简单的查询。
问题:有什么方法可以告诉 Entity Framework 理解下面的 TPT 模式并相应地做更简洁的选择查询?其次,我可以从 ORM 中隐藏类型列并让它只出现在数据库中吗?
举个例子:
父表:
儿童桌:
database-design - 用于将表与其他 2 个表中的 1 个相关联的数据库设计
我有一个包含一些用户和代理的数据库,并想添加一个简单的消息系统。
所以我有以下一组简单的表格:
我没有来自消息和发布消息的个人的关系。
我有点卡住了,因为它可能是用户或代理。我认为这一定是一个常见问题,需要解决一个公认的模式,但我还没有找到这样的讨论。
我知道我有几个选择,但它们都有缺点。
选项 1: 我不喜欢一条消息可以将两个链接到不同的帐户。
选项 2: 这使得在 SELECT 的一列中获取所有消息变得很尴尬。
我无法将用户和代理合并到一张表中的一件事。那是一成不变的。