保持此架构清晰的最佳方法是什么?

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抱歉.这里不是母语人士.

Nat*_*erl 7

您可以使用关系约束来强制执行这些规则.检查使用持久列来强制执行约束标记:{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)