我有4种类型的用户,每个都有具体的数据,但他们也分享COMMUN数据,如username
,password
..
我的第一个想法是users
用user_type
列创建一个主表。然后,当查询用户数据时,我可以先选择它们user_type
,然后根据output
运行情况选择不同的查询来获取“用户类型”的特定数据。我对此并不满意,因为我希望我可以通过一个查询并最好使用外键来获取所有与用户相关的数据。
第二个想法是user_type
在users
表中没有列,而是使用外键,该键来自特定用户类型的表将指向主users
表的一行。尽管我想我将必须运行N个查询,但我还是会更好一些,其中N是每次我需要获取用户数据时用户类型的数量。
还有其他选择吗?在这种情况下,什么是好的做法?
非常感谢
您的案例看起来像是类/子类的实例。
有两种设计SQL表以处理子类的经典方法。每种都有优点和缺点。
一种方法称为“单表继承”。在此设计中,只有一张桌子可供所有类型的用户使用。如果给定的列与给定的行不相关,则交集为NULL。可以添加一列以指示用户类型。
另一种方法称为“类表继承”。这很像Nanego给出的答案,但做了一些小的更改。有一个供用户使用的表,其中包含所有常用数据和一个id字段。每个子类都有一个表,其中包含与该子类有关的数据。id字段通常设置为用户表中匹配行中id字段的副本。这样,子类键可以起到双重作用,既充当主键又充当引用用户表的外键。最后一种技术称为“共享主键”。插入时需要一些编程,但这是值得的。它增强了关系的一对一性质,并加快了必要的联接。
您可以将所有这三种设计查找为SO中的标签或Web上的文章。
单表继承 类表继承
共享主键
【注意】下列选项和选项卡会根据服务器版本和用户类型而有所不同。 常规属性 用户名 定义数据库用户的名。 验证 选择数据库用户的安全类型。 登录名 指定数据库用户使用的 SQL Server 登录。 默认模式 选择将拥有此数据库用户创建之对象的默认模式。 证书名 选择要用于数据库用户的证书。 非对称密钥名 选择要用于数据库用户的非对称密钥。 角色 在列表里,指定此数据库用户成为已选择的数据库角色的成
【注意】下列选项和选项卡会根据服务器版本和用户类型而有所不同。 常规属性 用户名 定义数据库用户的名。 验证 选择数据库用户的安全类型。 登录名 指定数据库用户使用的 SQL Server 登录。 默认模式 选择将拥有此数据库用户创建之对象的默认模式。 证书名 选择要用于数据库用户的证书。 非对称密钥名 选择要用于数据库用户的非对称密钥。 角色 在列表里,指定此数据库用户成为已选择的数据库角色的成
【注意】下列选项和选项卡会根据服务器版本和用户类型而有所不同。 常规属性 用户名 定义数据库用户的名。 验证 选择数据库用户的安全类型。 登录名 指定数据库用户使用的 SQL Server 登录。 默认模式 选择将拥有此数据库用户创建之对象的默认模式。 证书名 选择要用于数据库用户的证书。 非对称密钥名 选择要用于数据库用户的非对称密钥。 角色 在列表里,指定此数据库用户成为已选择的数据库角色的成
问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 2年前关闭。 改善这个问题 我正在寻找有关关系数据库设计,性能调整等最佳实践的书/站点/教程。有很多“这里是归一化,这是ER图,”,但在实际示例中却没有太多。有人有想法么? 问题答案: 图书:仅凡人的数据库设计
问题内容: 让我们说我需要设计一个数据库,该数据库将托管多个公司的数据。现在出于安全和管理目的,我需要确保正确隔离了不同公司的数据,但我也不想启动10个mysql进程来在10个不同的服务器上托管10个公司的数据。使用mysql数据库执行此操作的最佳方法是什么。 问题答案: 多租户数据库有几种方法。为了进行讨论,它们通常分为三类。 每个租户一个数据库。 共享数据库,每个租户一个模式。 共享数据库,共
问题内容: 一个客户可以有多个电话号码,例如手机,工作场所等。“客户”表中的phoneID是唯一的,并且指向“电话”表中的PhoneID。如果删除了客户记录,则“电话”表中的phoneID也应删除。 您对我的设计有任何疑问吗?这个设计合理吗?我的问题是客户表中的phoneID是子项,如果子项记录被删除,那么我无法自动删除父项(电话)记录。 问题答案: 由于mrjoltcola已经解决了标准化问题,