Angenommen, die Messtypen werden nicht gemischt (dh eine bestimmte Zeile mischt nicht "kg" und "Zoll" ODER "Pfund" und "cm"), und es wird auch angenommen, dass sich zumindest ein Teil der Absicht dieser Frage jetzt darauf bezieht gelöschte verwandte Frage ( bitte beachten Sie, dass der folgende Link nur funktioniert, wenn Sie über genügend Wiederholungspunkte verfügen, um gelöschte Elemente anzuzeigen : Behandeln von zusammengesetzten Attributen mit konstantem Teil ), müssen Sie nur das von dieser Zeile verwendete Messsystem angeben . In diesem Modell hätten Sie eine einzelne MeasurementSystemTabelle mit Fremdschlüssel für alle Tabellen, die Messungen enthalten. Zum Beispiel (unter Verwendung der Microsoft SQL Server-Syntax):
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');
Wenn Sie Messsysteme mischen und / oder mehrere Maßeinheiten zulassen, auch wenn diese auf ein System beschränkt sind (dh "mm", "cm", "m"), muss eine vorhanden sein zusätzliche Ebene, um die Zunahme der Granularität zu bewältigen, einschließlich der Notwendigkeit, ein FK-Feld pro Messspalte in der PersonTabelle zu haben. (Ich kann das obige Modell anpassen, aber ich werde auf eine Klarstellung warten, bevor ich dies tue).
Wenn es eine relativ begrenzte Anzahl von Kombinationen verschiedener Gewichts- und Höheneinheiten gibt, können Sie stattdessen jede Zeile verwenden, um eine der akzeptierten Kombinationen darzustellen (z. B. "cm & kg", "m & kg"). "mm & kg" / "inch & lb", "foot & lb"). Und dann ist "US" vs "Metric" nur eine Eigenschaft jeder Zeile der Nachschlagetabelle. Zum Beispiel:
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,
...
);
Oder wenn es Kombinationen von Einheiten geben muss, die verschiedene Messsysteme kreuzen, würde ich separate Tabellen verwenden - eine für jeden Messtyp: "WeightUnits" und "HeightUnits". Ich würde keine Einheiten für Höhen und Gewichte in derselben Tabelle mischen (dh "kg" und "cm" in verschiedenen Reihen). Zum Beispiel:
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"
);
In diesem Modell hat jeder Messtyp in einer bestimmten Tabelle eine eigene persönliche FK für die Nachschlagetabelle der Maßeinheiten.