Чтобы ответить на ваш первый вопрос, я бы сохранил что-то вроде:
STATE
----------------------------
STATE_KEY NOT NULL NUMBER
COUNTRY NOT NULL VARCHAR2(3) (ISO 3-letter code)
STATE_SHORT NOT NULL VARCHAR2(30)
STATE_NAME NOT NULL VARCHAR2(30)
CITY
----------------------------
CITY_KEY NOT NULL NUMBER
STATE NOT NULL NUMBER (FK into STATE)
CITY_NAME NOT NULL VARCHAR2(30)
LAT NUMBER
LOG NUMBER
COMPANIES
----------------------------
STATE_ID NUMBER NOT NULL (FK into State)
.... Other Data Cols.....
Одна вещь, которую вы могли бы рассмотреть, - это связать компании с ключом города и FK с городом, и иметь такие города, как сша; fl; нуль и сша; ca; ноль, чтобы представлять все города в этом штате. Таким образом, преобразование в компании, основанные на определенном городе, на самом деле не меняет вашу общую схему. Если вы знаете, что вы всегда будете иметь дело с компаниями, связанными со штатами, то выполнение state_id в компаниях (как показано выше) было бы предпочтительным.
Удачи в вашем проекте.