@Override
  public final List<ForeignKeyDefinition> getForeignKeys(SchemaDefinition schema) {
    if (foreignKeys == null) {
      foreignKeys = new ArrayList<ForeignKeyDefinition>();

      for (SchemaDefinition s : getSchemata()) {
        for (TableDefinition table : getTables(s)) {
          for (ForeignKeyDefinition foreignKey : table.getForeignKeys()) {
            foreignKeys.add(foreignKey);
          }
        }
      }
    }

    if (foreignKeysBySchema == null) {
      foreignKeysBySchema = new LinkedHashMap<SchemaDefinition, List<ForeignKeyDefinition>>();
    }

    return filterSchema(foreignKeys, schema, foreignKeysBySchema);
  }