Giả sử rằng các loại đo lường sẽ không được trộn lẫn (tức là bất kỳ hàng cụ thể nào sẽ không trộn "kg" và "inch" HOẶC "pound" và "cm"), và cũng giả sử rằng ít nhất một phần ý định của Câu hỏi này liên quan đến điều này ngay bây giờ Câu hỏi liên quan đã xóa ( xin lưu ý rằng liên kết sau sẽ không hoạt động trừ khi bạn có đủ điểm rep để xem các mục bị xóa: Xử lý các thuộc tính tổng hợp với phần không đổi ), sau đó bạn chỉ cần chỉ ra hệ thống đo lường được sử dụng bởi hàng đó. Trong mô hình này, bạn sẽ có một MeasurementSystembảng duy nhất là Khóa ngoài cho bất kỳ bảng nào chứa các phép đo. Ví dụ: (sử dụng cú pháp Microsoft SQL Server):
CREATE TABLE dbo.MeasurementSystem
(
MeasurementSystemID TINYINT NOT NULL
CONSTRAINT [PK_MeasurementSystem] PRIMARY KEY
CLUSTERED,
MeasurementSystemName NVARCHAR(50) NOT NULL
);
dbo.Person
(
PersonID INT NOT NULL IDENTITY(1, 1)
CONSTRAINT [PK_Person] PRIMARY KEY
CLUSTERED,
MeasurementSystemID TINYINT NOT NULL
CONSTRAINT [FK_Person_MeasurementSystem]
FOREIGN KEY
REFERENCES dbo.MeasurementSystem (MeasurementSystemID),
Name NVARCHAR(50) NOT NULL
Height FLOAT,
Weight FLOAT,
...
);
INSERT INTO dbo.MeasurementSystem (MeasurementSystemID, MeasurementSystemName)
VALUES (1, N'Metric');
INSERT INTO dbo.MeasurementSystem (MeasurementSystemID, MeasurementSystemName)
VALUES (2, N'United States customary units');
Nếu bạn sẽ trộn các hệ thống đo lường và / hoặc nếu bạn sẽ cho phép nhiều đơn vị đo ngay cả khi bị giới hạn trong một hệ thống (nghĩa là cho phép "mm", "cm", "m"), thì sẽ cần phải có một lớp bổ sung để xử lý sự gia tăng độ chi tiết, bao gồm cần phải có một trường FK cho mỗi cột đo trong Personbảng. (Tôi có thể điều chỉnh mô hình ở trên để phù hợp với điều này nhưng sẽ chờ một số giải thích rõ ràng trước khi thực hiện).
Hoặc, nếu sẽ có một số lượng kết hợp khá hữu hạn / giới hạn của các đơn vị trọng lượng và đơn vị chiều cao khác nhau, thì bạn có thể sử dụng mỗi hàng để thể hiện một trong các kết hợp được chấp nhận (ví dụ: "cm & kg", "m & kg", "mm & kg" / "inch & lb", "chân & lb"). Và sau đó "US" so với "Số liệu" chỉ là một thuộc tính của mỗi hàng của bảng tra cứu. Ví dụ:
CREATE TABLE dbo.MeasurementUnit
(
MeasurementUnitID TINYINT NOT NULL
CONSTRAINT [PK_MeasurementUnit] PRIMARY KEY
CLUSTERED,
MeasurementSystem CHAR(1) NOT NULL, -- "M" = Metric, "U" = US
MeasurementSystemName NVARCHAR(50) NOT NULL, -- "Metric" or "US Nonsense"
HeightUnitsName NVARCHAR(20) NOT NULL, -- "Centimeters"
HeightUnitsAlias NVARCHAR(5) NOT NULL, -- "cm"
WeightUnitsName NVARCHAR(20) NOT NULL, -- "Kilograms"
WeightUnitsAlias NVARCHAR(5) NOT NULL -- "kg"
);
dbo.Person
(
PersonID INT NOT NULL IDENTITY(1, 1)
CONSTRAINT [PK_Person] PRIMARY KEY
CLUSTERED,
MeasurementUnitID TINYINT NOT NULL
CONSTRAINT [FK_Person_MeasurementUnit]
FOREIGN KEY
REFERENCES dbo.MeasurementUnit (MeasurementUnitID),
Name NVARCHAR(50) NOT NULL
Height FLOAT,
Weight FLOAT,
...
);
Hoặc, nếu cần phải có sự kết hợp của các Đơn vị vượt qua các hệ thống đo lường khác nhau, thì tôi sẽ sử dụng các bảng riêng biệt - một bảng cho mỗi loại đo lường: "WeightUnits" và "heightUnits". Tôi sẽ không trộn các đơn vị cho chiều cao và trọng lượng trong cùng một bảng (nghĩa là "kg" và "cm" trên các hàng khác nhau). Ví dụ:
CREATE TABLE dbo.WeightUnit
(
WeightUnitID TINYINT NOT NULL
CONSTRAINT [PK_WeightUnit] PRIMARY KEY
CLUSTERED,
MeasurementSystem CHAR(1) NOT NULL, -- "M" = Metric, "U" = US
WeightUnitName NVARCHAR(50) NOT NULL, -- "Kilograms"
WeightUnitAlias NVARCHAR(5) NOT NULL -- "kg"
);
CREATE TABLE dbo.HeightUnit
(
HeightUnitID TINYINT NOT NULL
CONSTRAINT [PK_HeightUnit] PRIMARY KEY
CLUSTERED,
MeasurementSystem CHAR(1) NOT NULL, -- "M" = Metric, "U" = US
HeightUnitName NVARCHAR(50) NOT NULL, -- "Centimeters"
HeightUnitAlias NVARCHAR(5) NOT NULL -- "cm"
);
Trong mô hình này, mỗi loại đo lường trong bất kỳ bảng đã cho nào đều có FK riêng cho bảng tra cứu đơn vị đo của nó.