Sql server 将多个不同类型的表与公共列组合在一起
我正在创建一个数据库,它有6种不同的用户类型(web_用户、卖家、维修中心等等),它们都有常用的选项(列),但每个都有一些其他用户类型没有的独特列 现在我想知道,只创建一个具有公共列的用户表并使用另一个表作为这些唯一列的选项表是明智的,还是应该为每个用户类型创建一个单独的表 编辑:实际上所有不同类型的网站都有相同的功能。这种差异就像卖家可以拥有一个网络用户无法拥有的徽标。制作人有其他人没有的制作人ID(由政府定义),并且。。。。Sql server 将多个不同类型的表与公共列组合在一起,sql-server,Sql Server,我正在创建一个数据库,它有6种不同的用户类型(web_用户、卖家、维修中心等等),它们都有常用的选项(列),但每个都有一些其他用户类型没有的独特列 现在我想知道,只创建一个具有公共列的用户表并使用另一个表作为这些唯一列的选项表是明智的,还是应该为每个用户类型创建一个单独的表 编辑:实际上所有不同类型的网站都有相同的功能。这种差异就像卖家可以拥有一个网络用户无法拥有的徽标。制作人有其他人没有的制作人ID(由政府定义),并且。。。。 所有这些唯一的列都是固定值,不需要对它们进行任何操作 这是一个有趣
所有这些唯一的列都是固定值,不需要对它们进行任何操作 这是一个有趣的问题。如果是我,我会使用两个表:一个用于所有公共属性,另一个用于所有用户的外围属性。大概是这样的:
CREATE TABLE _UserProperties(
ID int ,
Property varchar(1000) ,
Value varchar(1000) ,
UserID int
) ;
insert into _UserProperties(id, property, value, userid)
values (1,'employee id', '123556',1),
(2,'CustomerID', '345677',2),
(2,'SalesGroup', 'ABFD34',2),
(2,'SalesToDate', '2344',2),
(3,'Project', 'cat juggling',3);
CREATE TABLE _Users(
ID int ,
UserName varchar(50) ,
UserAddress varchar(1000) ,
UserType varchar(50)
) ;
insert into _Users (ID, UserName, UserAddress, UserType)
values (1,'Fred Jones','123 Mample','Customer'),
(2,'Sam Smith','234 Oak','Employee'),
(3,'Sally Black','345 Pine','Consultant');
然后,您可以将所有内容与一个简单的查询结合起来,如:
select * from _users a left join _userProperties b
on a.id = b.userid
或者使用数据透视表将行转换为列
这是一个有趣的问题。如果是我,我会使用两个表:一个用于所有公共属性,另一个用于所有用户的外围属性。大概是这样的:
CREATE TABLE _UserProperties(
ID int ,
Property varchar(1000) ,
Value varchar(1000) ,
UserID int
) ;
insert into _UserProperties(id, property, value, userid)
values (1,'employee id', '123556',1),
(2,'CustomerID', '345677',2),
(2,'SalesGroup', 'ABFD34',2),
(2,'SalesToDate', '2344',2),
(3,'Project', 'cat juggling',3);
CREATE TABLE _Users(
ID int ,
UserName varchar(50) ,
UserAddress varchar(1000) ,
UserType varchar(50)
) ;
insert into _Users (ID, UserName, UserAddress, UserType)
values (1,'Fred Jones','123 Mample','Customer'),
(2,'Sam Smith','234 Oak','Employee'),
(3,'Sally Black','345 Pine','Consultant');
然后,您可以将所有内容与一个简单的查询结合起来,如:
select * from _users a left join _userProperties b
on a.id = b.userid
或者使用数据透视表将行转换为列
这里有一个如果它能让您更容易地执行需要在这些表上执行的大多数操作,那么它是明智的。这些选项是称为和的模式。您可以根据需要支持的功能决定使用哪一个。编辑:还有一个叫做@w0lf的第三个相关模式。如果我已经编辑了我的问题,你能看一下吗?如果它能让你更容易地在这些表上执行大多数需要执行的操作,这是明智的。这些选项是称为和的模式。您可以根据需要支持的功能决定使用哪一个。编辑:还有第三个相关的模式叫@w0lf我编辑了我的问题,你能看一下吗?是的,我确实想到了这一点,但不确定是这样使用它还是将表分开我认为从长远来看,将每个数据元素分解成自己的表会使编程更容易,但是,如果它报告您的目标或快速交付解决方案,那么更少的表会有所帮助。是的,我确实想到了这一点,但不确定是这样使用它还是将表分开。我认为从长远来看,将每个数据元素分解为自己的表会使编程更容易,但是,如果是报告您的目标或快速交付解决方案,则较少的表会有所帮助。