sql – 这些数据库设计样式(或反模式)有名称吗?

考虑一个包含表Products和Employees的数据库.对当前产品经理进行建模是一项新要求,他们是负责产品的唯一员工,并指出某些产品简单或成熟,不需要产品经理.也就是说,每个产品可以有零个或一个产品经理.

方法1:alter table Product添加新的NULLable列product_manager_employee_ID,以便没有产品经理的产品由NULL值建模.

方法2:使用非NULLable列product_ID和employee_ID创建一个新表ProductManagers,对product_ID具有唯一约束,以便没有产品管理器的产品通过此表中没有行来建模.

还有其他方法,但这些是我似乎经常遇到的两种方法.

假设这些都是合法的设计选择(我倾向于相信)并且只代表不同的风格,他们有名字吗?我更喜欢方法2并且发现很难将风格差异传达给那些喜欢方法1而没有使用实际例子的人(正如我在这里所做的那样!)如果我能说,我会很高兴,“我更喜欢我自己倾向于6NF(或其他)风格.“

假设其中一种方法实际上是一种反模式(因为我只是怀疑方法1的情况可能是通过将两个实体之间的关系建模为这些实体之一的属性),这种反模式是否具有名称

解决方法

那么第一个只不过是一对多的关系(一个员工对很多产品).这有时被称为O:M关系(零到多),因为它是可选的(并非每个产品都有产品经理).同样不是每个员工都是产品经理,所以在另一方面也是可选的.

第二个是连接表,通常用于多对多关系.但由于一方只是一对一(每个产品只在表中一次),它实际上只是一个错综复杂的一对多关系.

就个人而言,我更喜欢第一个但不是错(或坏).

第二个用于考虑的两个原因.

>您设想产品可能有多个经理;要么>您希望跟踪产品经理的产品历史记录.你这样做,比如说current_flag列设置为’Y'(或类似),其中一次只能有一个当前.这实际上是以数据库为中心的应用程序中非常常见的模式.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...