2014-12-16 2 views
2

Я создал таблицу для лодки, которая содержит следующие столбцы: BName, Type, Price, OName.Многозначный столбец в SQL

Однако колонка Type должна быть одной из следующих: Парусник, плавучий дом или палуба.

Как я могу отразить это в инструкции create table. Я искал об этом, и я пришел с этим утверждением, которое я не уверен, правильно ли это или нет:

CREATE TABLE Boat 
(
    BName varchar(255), 
    BType int, 
    Price double, 
    OName varchar(255), 
    PRIMARY KEY (BName), 
    FOREIGN KEY (BType) REFERENCES BoType(ID) 
); 

CREATE TABLE BoType 
(
    ID int PRIMARY KEY, 
    Type varchar(255) 
) 

Это лучший способ сделать это?

+0

Выглядит неплохо. Если некоторые из ваших данных можно рассматривать как отдельный объект (в вашем случае тип лодки), то это обычный способ сохранить его в отдельной таблице и создать внешний ключ для обеспечения согласованности. –

+0

Единственное, что я бы изменил, это изменить тип 'int' вашего PK на' BoType' на 'tinyint' и то же для' BType' на 'Boat'. Это позволит сэкономить 3 байта на строку. Ответ FoggyDay также работает, но если вы начнете использовать больше типов лодок, он получит cumbersum – JRLambert

+1

Tinyint не является типом данных ANSI/ISO SQL. Stick с целым числом. Также добавьте уникальные ограничения, например, для типа лодки. Возможно, NOT NULL - хорошая идея для некоторых столбцов. – jarlh

ответ

1

Вы можете попробовать что-то вроде этого:

mycol VARCHAR(10) NOT NULL CHECK (mycol IN('moe', 'curley', 'larry'))

здесь более подробно о MSSQL "проверочные ограничения":

+0

Что делать, если OP когда-нибудь захочет расширить типы? В вашем случае будет необходимо изменить столбец, но в предложенном случае OP достаточно просто добавить еще одну запись в таблицу «BoType» (это может быть сделано даже конечным пользователем через некоторый пользовательский интерфейс, но вашему предложению требуется база данных введение). –

1

Это самый лучший способ сделать просто убедитесь, что вы заполняете таблицу BoType нужной ссылкой val (т. е. Парусник, плавучий дом, палуба). Потому что, если вы используете ограничение, то у вас есть пользователь базы данных, у которой нет знаний в SQL или нет прав доступа в вашей БД, по вашей милости или они становятся слишком зависимыми от вас. Однако, если вы установите его как отдельную таблицу, тогда пользователь вашей системы/базы данных, даже не зная о SQL, может добавлять или изменять значения через вашу программу front-end (например, ASP, PHP). Другими словами, дизайн более гибкий и масштабируемый, не говоря уже о меньшем объеме обслуживания в вашей части.