Hat*_*azy 2 database-design sql-server
我的项目是为许多国家设计一个医学数据库。
该数据库包含许多部分:每个国家都有自己的语言的药品、医疗中心、患者等。
我从医学部分开始我的设计,但我有很多问题仍在继续:
我上传了 2 张图片,用于药物部分的初始设计,仅限英文。
注意:这两张照片只是一张,但太大了所以我把它分成了两半
我使用 SQL Server 2008。
- 如何将所有这些复杂的部分放在一个不同语言的数据库中?
我可以通过假设以下业务需求来举例说明如何对多语言名称数据进行建模:
您需要一种方法来识别数据库中的语言,以便您可以将药物名称与特定语言相关联。
识别语言的简单标准是ISO 619-1,它为世界上最常用的语言定义了一个由两个字母组成的代码。例如,英语的代码是en
,法语是fr
,西班牙语是es
。
以下 SQL 创建一个带有语言代码列的表,然后使用示例语言填充该表:
CREATE TABLE Languages (
LanguageCode CHAR(2) NOT NULL,
CONSTRAINT PK_Languages PRIMARY KEY (LanguageCode),
CONSTRAINT CK_LowerAlpha CHECK (LanguageCode NOT LIKE '%[^a-z]%' COLLATE Latin1_General_BIN2)
);
INSERT INTO Languages (
LanguageCode
)
VALUES
('en'),
('fr'),
('es');
Run Code Online (Sandbox Code Playgroud)
您的实体模型中没有与此表对应的任何内容,这可以解释为什么您发现难以对多语言数据进行建模。
接下来,您需要一种方法来识别构成每种药物的化学物质。
识别化学品的常用方法是CAS 登记编号,它为 Science 已知的每种化学品定义了一个数字代码。例如,水的代码是7732-18-5
,甲醛是50-00-0
,芥末油是8007-40-7
。
以下 SQL 创建一个包含化学代码列的表,然后使用示例化学品填充该表:
CREATE TABLE Chemicals (
ChemicalCode VARCHAR(12) NOT NULL,
CONSTRAINT PK_Chemicals PRIMARY KEY (ChemicalCode),
CONSTRAINT CK_Dashes CHECK (ChemicalCode LIKE '%_-__-_'),
CONSTRAINT CK_Digits CHECK (REPLACE(ChemicalCode, '-', '') NOT LIKE '%[^0-9]%')
);
INSERT INTO Chemicals (
ChemicalCode
)
VALUES
('7732-18-5'),
('50-00-0'),
('8007-40-7');
Run Code Online (Sandbox Code Playgroud)
Chemicals 表大致对应于图中的 Drugs_Ingredients 实体,但缺少名称列。
为简单起见,该表不强制执行校验和约束。在生产中使用 CAS 注册号之前,您应该强制执行校验和约束。
如果您将名称存储在 Chemicals 表的一列中,将难以支持多种语言。每个语言可以有一个列,但是每次要支持新语言时都必须修改架构。
为了摆脱这些限制,您应该将化学名称建模为可识别的实体。您可以使用化学代码和语言代码的化合物标识来识别化学名称。
以下 SQL 创建一个表,其中包含化学代码、语言代码和化学名称的列,然后用每种化学的每种语言的一个名称填充表:
CREATE TABLE ChemicalNames (
ChemicalCode VARCHAR(12) NOT NULL,
LanguageCode CHAR(2) NOT NULL,
ChemicalName NVARCHAR(50) NOT NULL,
CONSTRAINT PK_ChemicalNames PRIMARY KEY (ChemicalCode, LanguageCode),
CONSTRAINT FK_ChemicalNames_ChemicalCode FOREIGN KEY (ChemicalCode) REFERENCES Chemicals(ChemicalCode),
CONSTRAINT FK_ChemicalNames_LanguageCode FOREIGN KEY (LanguageCode) REFERENCES Languages(LanguageCode)
);
INSERT INTO ChemicalNames (
ChemicalCode,
LanguageCode,
ChemicalName
)
VALUES
('7732-18-5', 'en', 'Water'),
('7732-18-5', 'fr', 'Eau'),
('7732-18-5', 'es', 'Agua'),
('50-00-0', 'en', 'Formaldehyde'),
('50-00-0', 'fr', 'Méthanal'),
('50-00-0', 'es', 'Formaldehído'),
('8007-40-7', 'en', 'Mustard oil'),
('8007-40-7', 'fr', 'Huile de moutarde'),
('8007-40-7', 'es', 'Aceite de mostaza');
Run Code Online (Sandbox Code Playgroud)
ChemicalName 列的类型为 NVARCHAR,因此它可以存储任何 Unicode 字符串。您应该在国际应用程序中始终使用 Unicode 来存储文本,以便您可以以统一的方式处理不同语言的书写系统。
我可以想到您可以合理地询问您的数据库的两个问题。使用 ChemicalNames 表,您可以通过简单的查询来回答这两个问题。
西班牙语中所有化学品的名称是什么?
询问:
SELECT ChemicalCode, ChemicalName
FROM ChemicalNames
WHERE LanguageCode = 'es';
Run Code Online (Sandbox Code Playgroud)
结果:
CHEMICALCODE CHEMICALNAME
50-00-0 Formaldehído
7732-18-5 Agua
8007-40-7 Aceite de mostaza
Run Code Online (Sandbox Code Playgroud)
每种语言中的水叫什么?
询问:
SELECT LanguageCode, ChemicalName
FROM ChemicalNames
WHERE ChemicalCode = '7732-18-5';
Run Code Online (Sandbox Code Playgroud)
结果:
LANGUAGECODE CHEMICALNAME
en Water
es Agua
fr Eau
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4942 次 |
最近记录: |