No es obligatorio, pero sí muy aconsejable.
Si vas a usar dos o tres tablas igual no, pero si quieres diseñar bien una base de datos, es mejor que te acostumbres a usar claves.
Como ejemplo te diré que cualquier aplicación que desarrollo, tenga dos o cien tablas, siempre tiene todas las claves necesarias. Y te explico porqué:
Las claves sirven para delegar responsabilidad en el control de los datos. Es decir, cuando defines las claves le estás diciendo al servidor de BBDD que se encargue de comprobar la coherencia de la información, porque sino tendrás que hacerlo tú por programa, y créeme, es mucho mejor que lo haga el gestor de la BBDD que el programa, así te olvidas de problemas.
En cuanto a las condiciones, son las que impone el sistema de BBDD y las que impone tu modelo.
Es decir, tienes que pensar que las relaciones (las claves) se pueden establecer de 1 a 1, o de 1 a n. Tienes que aplicar este concepto a tu base de datos.
Es difícil dar una explicación a algo tan genérico, así que es mejor que la pregunta sea más concreta. Te pongo un ejemplo:
Imagina que tienes una tabla con cabeceras de factura (id, código, fecha, cliente, presupuesto, base, tipo_de_iva, tipo_de_descuento, total) y otra con lineas de factura (id_linea, cantidad, descripción, precio). Lo mejor es que la tabla de lineas tenga un campo más que sea la id de la factura, y que exista una clave entre las dos tablas, así sabrás que no puedes tener ninguna línea de factura que no esté referenciada a una factura, y que todas las lineas hacen referencia a una factura.
Por último, un consejo, si puedes, es mejor que los valores de las claves sean integer, para cualquier SGBD es más rápido comparar dos números que dos cadenas, y ganas en rendimiento.