raz*_*tia 9 database sql-server polymorphic-associations
目前我正在开发一个RFID项目,每个标签都附在一个物体上.一个物体可以是一个人,一台电脑,一支铅笔,一个盒子或者老板心中的任何东西.当然,每个对象都有不同的属性.
所以我想要一个表标签,我可以在其中保存系统中每个标签的寄存器(标签的注册).另外一个表格,我可以将标签与对象相关联并描述其他一些属性,这就是我们所做的.(没有真正的架构只是一个简化版本)

突然间,我意识到这个模式在几个表中可以有相同的标记.例如,标签123可以同时在C和B中.这是不可能的,因为每个标签只能附加到一个对象上.
简单来说,我希望每个标记在数据库中不会出现多次.
我目前的做法

我真正想要的是什么

更新: 是的,TagID由最终用户选择.此外,TagID由标签阅读器给出,TagID是128位数.
新更新: 到目前为止的对象是:
- 药物(TagID,comercial_name,generic_name,amount,...)
- 机器(TagID,名称,描述,型号,制造商......)
- 患者(TagID,firstName,lastName,birthday,...)
所有属性(列或您命名的任何属性)都是非常不同的.
更新后更新
我正在研究一个带有医院RFID标签的系统.每个RFID标签都附着在一个物体上以便观察它们,不幸的是每个物体都有许多不同的属性.
对象可以是人,机器或药物,也可以是具有其他属性的新对象.
所以,我只想要一个灵活的切割器架构.这允许我引入新对象的类型,并让我轻松地向一个对象添加新属性.请记住,这个系统可能非常庞大.
例子:
Tag(TagID)
Medicine(generic_name, comercial_name, expiration_date, dose, price, laboratory, ...)
Machine(model, name, description, price, buy_date, ...)
Patient(PatientID, first_name, last_name, birthday, ...)
Run Code Online (Sandbox Code Playgroud)
我们必须只为一个对象关联一个标记.
注意:我真的不会说(或者也写):P抱歉.这里不是母语人士.
您可以使用关系约束来强制执行这些规则.检查使用持久列来强制执行约束标记:{Pencil或Computer}.此模型为您提供了极大的灵活性,可以对每个子表(人物,机器,铅笔等)进行建模,同时防止标记之间发生任何冲突.同样好,我们不必通过检查约束来使用触发器或udfs来强制执行关系.该关系内置于模型中.

create table dbo.TagType (TagTypeID int primary key, TagTypeName varchar(10));
insert into dbo.TagType
values(1, 'Computer'), (2, 'Pencil');
create table dbo.Tag
( TagId int primary key,
TagTypeId int references TagType(TagTypeId),
TagName varchar(10),
TagDate datetime,
constraint UX_Tag unique (TagId, TagTypeId)
)
go
create table dbo.Computer
( TagId int primary key,
TagTypeID as 1 persisted,
CPUType varchar(25),
CPUSpeed varchar(25),
foreign key (TagId, TagTypeID) references Tag(TagId, TagTypeID)
)
go
create table dbo.Pencil
( TagId int primary key,
TagTypeId as 2 persisted,
isSharp bit,
Color varchar(25),
foreign key (TagId, TagTypeID) references Tag(TagId, TagTypeId)
)
go
-----------------------------------------------------------
-- create a new tag of type Pencil:
-----------------------------------------------------------
insert into dbo.Tag(TagId, TagTypeId, TagName, TagDate)
values(1, 2, 'Tag1', getdate());
insert into dbo.Pencil(TagId, isSharp, Color)
values(1, 1, 'Yellow');
-----------------------------------------------------------
-- try to make it a Computer too (fails FK)
-----------------------------------------------------------
insert into dbo.Computer(TagId, CPUType, CPUSpeed)
values(1, 'Intel', '2.66ghz')
Run Code Online (Sandbox Code Playgroud)