public Vector<HashSet<Attribute>> findAllModelKeys() {
		Vector<HashSet<Attribute>> keys = new Vector<HashSet<Attribute>>();

		HashSet<Attribute> key = findModelKey();
		keys.add(key);
		boolean done = false;
		while (!done) {
			done = true;
			for (FunctionalDependency dep : deps) {
				HashSet<Attribute> rightSideCopy = new HashSet<Attribute>(dep.right);
				rightSideCopy.retainAll(key); // Remove the last key from the right side of the rule and see if something stays
				HashSet<Attribute> rest = new HashSet<Attribute>(key);
				rest.addAll(dep.left);
				rest.removeAll(dep.right);
				if (!rightSideCopy.isEmpty()) {
					boolean availableKey = true;
					for (HashSet<Attribute> k : keys) {
						if (rest.containsAll(k)) {
							availableKey = false;
						}
					}
					if (availableKey) {
						AttributeModel tmp = new AttributeModel(new HashSet<Attribute>(rest), new HashSet<FunctionalDependency>(deps));
						FunctionalDependency dp = new FunctionalDependency(rest, attributes);
						FunctionalDependency r = tmp.getReducedDependency(dp);
						keys.add(r.left);
						key = r.left;
						done = false;
					}

				}
			}
		}

		return keys;
	}